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 0000000..daa7787 Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/demo/model.miff differ diff --git a/ImageMagick-6.9.12-44/Magick++/demo/piddle.cpp b/ImageMagick-6.9.12-44/Magick++/demo/piddle.cpp new file mode 100644 index 0000000..0d17ecd --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/demo/piddle.cpp @@ -0,0 +1,182 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003 +// +// PerlMagick "piddle" demo re-implemented using Magick++ methods. +// The PerlMagick "piddle" demo is written by Cristy +// + +#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" ); + + // 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 0000000..0d7cb53 Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/demo/smile.miff differ 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 0000000..281894d Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/demo/smile_anim.miff differ diff --git a/ImageMagick-6.9.12-44/Magick++/demo/tile.miff b/ImageMagick-6.9.12-44/Magick++/demo/tile.miff new file mode 100644 index 0000000..911451a Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/demo/tile.miff differ 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 0000000..daa7787 Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/examples/model.miff differ diff --git a/ImageMagick-6.9.12-44/Magick++/examples/piddle.cpp b/ImageMagick-6.9.12-44/Magick++/examples/piddle.cpp new file mode 100644 index 0000000..0d17ecd --- /dev/null +++ b/ImageMagick-6.9.12-44/Magick++/examples/piddle.cpp @@ -0,0 +1,182 @@ +// This may look like C code, but it is really -*- C++ -*- +// +// Copyright Bob Friesenhahn, 1999, 2000, 2002, 2003 +// +// PerlMagick "piddle" demo re-implemented using Magick++ methods. +// The PerlMagick "piddle" demo is written by Cristy +// + +#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" ); + + // 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 0000000..0d7cb53 Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/examples/smile.miff differ 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 0000000..281894d Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/examples/smile_anim.miff differ diff --git a/ImageMagick-6.9.12-44/Magick++/examples/tile.miff b/ImageMagick-6.9.12-44/Magick++/examples/tile.miff new file mode 100644 index 0000000..911451a Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/examples/tile.miff differ 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 0000000..328281b Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/tests/test_image.miff differ diff --git a/ImageMagick-6.9.12-44/Magick++/tests/test_image_anim.miff b/ImageMagick-6.9.12-44/Magick++/tests/test_image_anim.miff new file mode 100644 index 0000000..b8e5f0c Binary files /dev/null and b/ImageMagick-6.9.12-44/Magick++/tests/test_image_anim.miff differ 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 0000000..8ea6470 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/Generic.ttf differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/Makefile b/ImageMagick-6.9.12-44/PerlMagick/demo/Makefile new file mode 100644 index 0000000..851dc16 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/Makefile @@ -0,0 +1,17 @@ +all: + perl demo.pl + perl button.pl + perl shapes.pl + perl piddle.pl + perl tree.pl + perl steganography.pl + perl shadow-text.pl + perl compose-specials.pl + perl pixel-fx.pl + perl single-pixels.pl + perl annotate.pl + perl composite.pl + +clean: + /bin/rm -f demo.jpg button.gif model.png shadow.gif tree.gif \ + compose-specials.jpg single-pixels.gif pixel-fx.gif diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/README b/ImageMagick-6.9.12-44/PerlMagick/demo/README new file mode 100644 index 0000000..ed08e90 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/README @@ -0,0 +1,6 @@ +This directory contains a number of PerlMagick demonstration scripts. Just +type + + make + +to exercise the various examples. diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/Turtle.pm b/ImageMagick-6.9.12-44/PerlMagick/demo/Turtle.pm new file mode 100644 index 0000000..8030ff0 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/Turtle.pm @@ -0,0 +1,57 @@ +package + Turtle; + +# Written by jreed@itis.com, adapted by Cristy. + +sub new +{ + my $class = shift; + my $self = {}; + + @{$self}{qw(x y theta mirror)} = @_; + bless $self, $class; +} + +sub forward +{ + my $self = shift; + my ($r, $what) = @_; + my ($newx, $newy)=($self->{x}+$r* 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 0000000..2569f63 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/dst.png differ 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 0000000..f58e4a8 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/model.gif differ 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 0000000..7222ff5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/pink-flower.gif differ 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 0000000..3e2aea5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/red-flower.gif differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/settings.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/settings.pl new file mode 100755 index 0000000..121b438 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/settings.pl @@ -0,0 +1,32 @@ +#!/usr/bin/perl +# +# An example of applying many settings in preparation for image creation. +# +# Extracted from PerlMagick Discussion forums.. +# Gravity center, caption and wrapped text +# https://imagemagick.org/discourse-server/viewtopic.php?f=7&t=17282 +# +use strict; +use warnings; +use Image::Magick; + +my $im = new Image::Magick; +my $e = $im->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 0000000..7dede2d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/smile.gif differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/src.png b/ImageMagick-6.9.12-44/PerlMagick/demo/src.png new file mode 100644 index 0000000..100dfe2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/src.png differ 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 0000000..99c8776 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/tile.gif differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/demo/tree.pl b/ImageMagick-6.9.12-44/PerlMagick/demo/tree.pl new file mode 100644 index 0000000..57b9f81 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/demo/tree.pl @@ -0,0 +1,35 @@ +#!/usr/bin/perl +# +# Example of using a lsys fractal, +# which in turm used Turtle Graphics +# +use Cwd; +use lib cwd; +require "lsys.pl"; + +%rule = ( + '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 0000000..a3e2345 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/demo/yellow-flower.gif differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL b/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL new file mode 100644 index 0000000..5863f88 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/quantum/Makefile.PL @@ -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../.. -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=WT +# + +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 0000000..d1d53a4 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_256.fpx differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_bw.fpx b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_bw.fpx new file mode 100644 index 0000000..8ebe811 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_bw.fpx differ 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 0000000..eb4b561 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_grayscale.fpx differ 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 0000000..9bc210c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_jpeg.fpx differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_truecolor.fpx b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_truecolor.fpx new file mode 100644 index 0000000..b7ce7dd Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/fpx/input_truecolor.fpx differ 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 0000000..6b1a785 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_256.hdf differ 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 0000000..183e90f Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/input_truecolor.hdf differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/hdf/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/read.t new file mode 100644 index 0000000..e6c44df --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/hdf/read.t @@ -0,0 +1,28 @@ +#!/usr/bin/perl +# +# Test reading 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 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 0000000..a6f4574 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.avs differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.bie b/ImageMagick-6.9.12-44/PerlMagick/t/input.bie new file mode 100644 index 0000000..8c6a1d1 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.bie differ 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 0000000..a714ce3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp differ 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 0000000..622864d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.bmp24 differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.dcx b/ImageMagick-6.9.12-44/PerlMagick/t/input.dcx new file mode 100644 index 0000000..15897a6 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.dcx differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.dib b/ImageMagick-6.9.12-44/PerlMagick/t/input.dib new file mode 100644 index 0000000..e201c88 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.dib differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.fits b/ImageMagick-6.9.12-44/PerlMagick/t/input.fits new file mode 100644 index 0000000..6e3c720 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.fits differ 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 0000000..72b1096 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.gif differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.gif87 b/ImageMagick-6.9.12-44/PerlMagick/t/input.gif87 new file mode 100644 index 0000000..e6e9c38 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.gif87 differ 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 0000000..f714eea Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.ico differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.im1 b/ImageMagick-6.9.12-44/PerlMagick/t/input.im1 new file mode 100644 index 0000000..d1cecd5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.im1 differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.im24 b/ImageMagick-6.9.12-44/PerlMagick/t/input.im24 new file mode 100644 index 0000000..9543824 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.im24 differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.im8 b/ImageMagick-6.9.12-44/PerlMagick/t/input.im8 new file mode 100644 index 0000000..234e19a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.im8 differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/input.mat b/ImageMagick-6.9.12-44/PerlMagick/t/input.mat new file mode 100644 index 0000000..464c9e5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input.mat differ 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=WT 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]]ee@@aaeeFFVVVV==WWTT<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 0000000..78ea147 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_08bit.mat differ 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 0000000..7686dc2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_lsb_double.mat differ 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 0000000..1517e38 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input_gray_msb_08bit.mat differ 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 0000000..c1cac18 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/input_p4.pbm differ 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=WT +# +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 0000000..6267b96 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray.jng differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_idat.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_idat.jng new file mode 100644 index 0000000..1376669 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_idat.jng differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_jdaa.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_jdaa.jng new file mode 100644 index 0000000..66e9223 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_jdaa.jng differ 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 0000000..def56e5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog.jng differ 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 0000000..634a009 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_idat.jng differ 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 0000000..75ba3f6 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_gray_prog_jdaa.jng differ 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 0000000..2b037b9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_idat.jng differ 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 0000000..deffc4c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_jdaa.jng differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog.jng new file mode 100644 index 0000000..afe6ab3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog.jng differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_idat.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_idat.jng new file mode 100644 index 0000000..d3790de Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_idat.jng differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_jdaa.jng b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_jdaa.jng new file mode 100644 index 0000000..ddaeebd Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_prog_jdaa.jng differ 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 0000000..518aeb7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jng/input_rose.jng differ 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 0000000..e8fdb0b Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input.jpg differ 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 0000000..f8aaa5c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/input_plane.jpg differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/read.t new file mode 100644 index 0000000..94a506d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/jpeg/read.t @@ -0,0 +1,29 @@ +#!/usr/bin/perl +# +# Test read image method on non-interlaced JPEG. +# +# 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 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 0000000..04b4a45 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.m2v differ 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 0000000..7a66614 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/mpeg/input.mpg differ 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 0000000..3f68405 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.j2k differ 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 0000000..383586e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jp2 differ 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 0000000..383586e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/openjp2/input.jpc differ 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 0000000..2694fc5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input.mng differ 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 0000000..06223a6 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_16.png differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input_256.png b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_256.png new file mode 100644 index 0000000..c674581 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_256.png differ 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 0000000..0020f80 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_bw.png differ 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 0000000..1b83ba9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_mono.png differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/png/input_truecolor.png b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_truecolor.png new file mode 100644 index 0000000..2cd0813 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/png/input_truecolor.png differ 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 0000000..135f7e3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/rad/input.rad differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/rad/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/rad/read.t new file mode 100644 index 0000000..0cd568e --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/rad/read.t @@ -0,0 +1,18 @@ +#!/usr/bin/perl +# +# Test reading Radiance file format +# +# 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/rad' || die 'Cd failed'; + +testRead( 'RAD:input.rad', + '5927b5f4dcf084e5f5fd841df8e4dfb40e4fe637419d022fc6a0b52f02600881'); diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/rad/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/rad/write.t new file mode 100644 index 0000000..1b8ae9d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/rad/write.t @@ -0,0 +1,25 @@ +#!/usr/bin/perl +# +# Test writing Radiance file format +# +# Currently supported tests are for formats that ImageMagick +# knows how to both read and write. +# +# 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/rad' || die 'Cd failed'; + +testReadWrite( 'RAD:input.rad', + 'MIFF:output.rad', + q//, + '5927b5f4dcf084e5f5fd841df8e4dfb40e4fe637419d022fc6a0b52f02600881'); + +1; diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/read.t new file mode 100644 index 0000000..26dcb53 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/read.t @@ -0,0 +1,222 @@ +#!/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 formats supported directly by ImageMagick. +# +BEGIN { $| = 1; $test=1; print "1..47\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +print("AVS X image file ...\n"); +testReadCompare('input.avs', 'reference/read/input_avs.miff', q//, 0.0, 0.0); + +print("Microsoft Windows bitmap image file ...\n"); +++$test; +testReadCompare('input.bmp', 'reference/read/input_bmp.miff', q//, 0.0, 0.0); + +print("Microsoft Windows 24-bit bitmap image file ...\n"); +++$test; +testReadCompare('input.bmp24', 'reference/read/input_bmp24.miff', q//, 0.0, 0.0); + +print("ZSoft IBM PC multi-page Paintbrush file ...\n"); +++$test; +testReadCompare('input.dcx', 'reference/read/input_dcx.miff', q//, 0.0, 0.0); + +print("Microsoft Windows bitmap image file ...\n"); +++$test; +testReadCompare('input.dib', 'reference/read/input_dib.miff', q//, 0.0, 0.0); + +print("Flexible Image Transport System ...\n"); +++$test; +testReadCompare('input.fits', 'reference/read/input_fits.miff', q//, 0.17, 0.7); + +print("CompuServe graphics interchange format ...\n"); +++$test; +testReadCompare('input.gif', 'reference/read/input_gif.miff', q//, 0.02, 1.02); + +print("CompuServe graphics interchange format (1987) ...\n"); +++$test; +testReadCompare('input.gif87', 'reference/read/input_gif87.miff', q//, 0.02, 1.02); + +print("Gradient (gradual passing from one shade to another) ...\n"); +++$test; +testReadCompare('gradient:red-blue', 'reference/read/gradient.miff', + q/size=>"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 0000000..2527a97 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/cgm/read.miff differ 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 0000000..f22a6c9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Add.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Atop.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Atop.miff new file mode 100644 index 0000000..ba7ac56 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Atop.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]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 0000000..b1898d0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Clear.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Copy.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Copy.miff new file mode 100644 index 0000000..ba7ac56 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Copy.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]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 0000000..ab36c06 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/CopyOpacity.miff differ 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]e@aeFVV=WT7=@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 0000000..e241df9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Out.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Over.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Over.miff new file mode 100644 index 0000000..ba7ac56 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Over.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]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 0000000..e241df9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/composite/Xor.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/AdaptiveThreshold.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/AdaptiveThreshold.miff new file mode 100644 index 0000000..301f4b0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/AdaptiveThreshold.miff differ 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 0000000..81ede08 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Annotate.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Blur.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Blur.miff new file mode 100644 index 0000000..86fff01 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Blur.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.51.72-82-81-80-80-80-7/-6.,5-+5-*5-*4-*3.)3/)41+74-:6.?:0D=1H?2K@2PA2\B2sC3B3B6C>?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 0000000..439d6a1 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Border.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Channel.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Channel.miff new file mode 100644 index 0000000..f242864 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Channel.miff @@ -0,0 +1,106 @@ +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=2013-03-22T17:22:54-04:00 +date:modify=2012-06-16T21:10:36-04:00 + +: + + + + + + +  + + -Rtzrk]PIHIJMQpM + +  9VC&-M2 + + + + + + +  + $Ca}pok\OHGHGHP}J + +  0L= 7& + ';X|`e`THECB@@T@ + &A%  + 1J]cTWULC?><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 0000000..4aef994 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Charcoal.miff differ 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=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]e@aeFVV=WT->-=,=+=+=+=+>-?/?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:09I32m@3tA4{B4C5C6C7C7D8D8D9C9C9C9C9C7C7C5B4A3B3{B5wC6sC7pD8nE: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ĽʿøynwxbmnWbdKWY@NP7KN6JN7IN7HN7GM7GM8FM8FL8EK9CJ8AH7?G7=F60H=.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 0000000..e2984f3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Opaque.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Quantize.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Quantize.miff new file mode 100644 index 0000000..c4c6aaa Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Quantize.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/QuantizeMono.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/QuantizeMono.miff new file mode 100644 index 0000000..d80940e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/QuantizeMono.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/RadialBlur.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/RadialBlur.miff new file mode 100644 index 0000000..d25ce47 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/RadialBlur.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/.10.40.51-60-6/,5/,70-7/-6/,6.+5-*4-*4-*3-)3.)30*52,84-;7/?:0D=2H?2L@2TA2bA1yB3C5C9C?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 0000000..d2d6661 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Segment.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Set.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Set.miff new file mode 100644 index 0000000..2c833dc --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Set.miff @@ -0,0 +1,14 @@ +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 +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=WT83=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|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 0000000..bc9d84e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Solarize.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Swirl.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Swirl.miff new file mode 100644 index 0000000..cea20d8 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/filter/Swirl.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-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=WT>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>ìhT>>>>>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 0000000..1ef75c0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/idat_tmp.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray.miff new file mode 100644 index 0000000..2e7732c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray.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_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_idat.miff new file mode 100644 index 0000000..af1c11c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_idat.miff differ 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 0000000..e8d1189 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_jdaa.miff differ 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 0000000..af1c11c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_idat.miff differ 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 0000000..e8d1189 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_gray_prog_jdaa.miff differ 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 0000000..621c674 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_idat.miff differ 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 0000000..9158c23 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_jdaa.miff differ 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 0000000..621c674 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_idat.miff differ 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 0000000..9158c23 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/input_prog_jdaa.miff differ 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 0000000..3bdfa32 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/jdaa_tmp.miff differ 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 0000000..1ef75c0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_idat_tmp.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_jdaa_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_jdaa_tmp.miff new file mode 100644 index 0000000..3bdfa32 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/prog_jdaa_tmp.miff differ 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 0000000..1a55df9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_idat.miff differ 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 0000000..df3fd07 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_jdaa.miff differ 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 0000000..1a55df9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_idat.miff differ 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 0000000..df3fd07 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_gray_prog_jdaa.miff differ 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 0000000..a6d2e2e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_idat.miff differ 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 0000000..655af2c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_jdaa.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog.miff new file mode 100644 index 0000000..b0bf8e8 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_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 + +:55,,##66--&&8800--::2200;;2255;;22338822228833//6644((5533$$3322 1100//00 ////##0000&&66..,,>>**55??++77;;0088999999;;BB::<>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 0000000..a6d2e2e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_idat.miff differ 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 0000000..655af2c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/read_prog_jdaa.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_gray.miff new file mode 100644 index 0000000..26202ca --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_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-21T07:35:57-04:00 +date:modify=2012-06-21T07:35:57-04:00 + +:......//////222222444444555555555555444444444444222222222222222222111111000000......------,,,,,,111111222222444444999999??????BBBBBBCCCCCCCCCCCCAAAAAAHHHHHHPPPPPPXXXXXXccccccoooooottttttrrrrrrvvvvvvttttttnnnnnneeeeeeaaaaaaaaaaaa^^^^^^XXXXXXXXXXXXVVVVVVVVVVVVWWWWWWWWWWWWYYYYYYbbbbbbmmmmmm[[[[[[@@@@@@444444555555222222111111333333//////))))))......))))))??????______uuuuuussssssSSSSSSUUUUUUwwwwwwvvvvvvOOOOOO......//////111111333333444444333333222222222222111111111111111111111111000000//////............111111111111222222555555999999==================BBBBBBGGGGGGLLLLLLQQQQQQ\\\\\\jjjjjjrrrrrrttttttvvvvvvrrrrrrjjjjjj``````]]]]]]______^^^^^^[[[[[[ZZZZZZUUUUUURRRRRRSSSSSSTTTTTTWWWWWW______hhhhhh]]]]]]@@@@@@222222555555666666666666555555------333333444444,,,,,,777777IIIIIIiiiiiiuuuuuu@@@@@@??????______uuuuuuVVVVVV------......000000111111111111000000//////......////////////////////////////////////////////////111111000000000000111111555555888888888888888888AAAAAADDDDDDFFFFFFHHHHHHQQQQQQaaaaaammmmmmrrrrrrvvvvvvqqqqqqffffff[[[[[[WWWWWWZZZZZZ[[[[[[YYYYYYTTTTTTOOOOOOLLLLLLOOOOOOTTTTTT[[[[[[eeeeeeooooooggggggFFFFFF333333333333444444555555444444,,,,,,222222111111......000000333333______zzzzzzLLLLLL999999::::::UUUUUUIIIIII::::::,,,,,,------......//////......------++++++******++++++++++++++++++++++++,,,,,,------------......000000//////......000000333333666666777777777777;;;;;;>>>>>>????????????GGGGGGVVVVVVcccccciiiiiissssssnnnnnnddddddXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRRPPPPPPOOOOOORRRRRRUUUUUU]]]]]]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[[[[[[OOOOOOEEEEEEBBBBBB@@@@@@<<<<<<;;;;;;<<<<<>>>>>????????????GGGGGGVVVVVVcccccciiiiiissssssnnnnnnddddddXXXXXXSSSSSSUUUUUUUUUUUURRRRRRRRRRRRPPPPPPOOOOOORRRRRRUUUUUU]]]]]]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[[[[[[OOOOOOEEEEEEBBBBBB@@@@@@<<<<<<;;;;;;<<<<<>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 0000000..f03697c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_idat.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_jdaa.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_jdaa.miff new file mode 100644 index 0000000..c458b66 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/jng/write_prog_jdaa.miff differ 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 0000000..e8d47b3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_j2k.miff differ 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 0000000..e8d47b3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jp2.miff differ 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 0000000..e8d47b3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/openjp2/read_jpc.miff differ 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 0000000..69718ad Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/gradient.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/granite.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/granite.miff new file mode 100644 index 0000000..0d7c235 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/granite.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_avs.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_avs.miff new file mode 100644 index 0000000..e6d9e84 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_avs.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=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 0000000..2709c67 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif.miff differ 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 0000000..7bf3e99 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gif87.miff differ 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 0000000..b71fd78 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_08bit_mat.miff differ 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 0000000..f4f61ac Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_lsb_double_mat.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_msb_08bit_mat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_msb_08bit_mat.miff new file mode 100644 index 0000000..e25a47f Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_gray_msb_08bit_mat.miff differ 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 0000000..43f4ae4 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_ico.miff differ 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 0000000..26f3844 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im1.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im24.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im24.miff new file mode 100644 index 0000000..429d3b4 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_im24.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=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 + +: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]]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/,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]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=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=WT}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 0000000..7828fe0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_viff.miff differ 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 0000000..7f184af Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wbmp.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wpg.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wpg.miff new file mode 100644 index 0000000..8cfd8f2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_wpg.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xbm.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xbm.miff new file mode 100644 index 0000000..95561cc Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xbm.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xc_black.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xc_black.miff new file mode 100644 index 0000000..eb7bd26 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xc_black.miff differ 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 0000000..327d9e7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/read/input_xpm.miff differ 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>>SSSwwwUUU```HHH:::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 0000000..421ae84 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/clock.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/wizard.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/wizard.miff new file mode 100644 index 0000000..c62463a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/wmf/wizard.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/cgm/read.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/cgm/read.miff new file mode 100644 index 0000000..2527a97 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/cgm/read.miff differ 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 0000000..8a1a4c0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Add.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Atop.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Atop.miff new file mode 100644 index 0000000..6178796 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Atop.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Bumpmap.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Bumpmap.miff new file mode 100644 index 0000000..bb73c93 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Bumpmap.miff differ 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 0000000..023ee92 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Clear.miff differ 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 0000000..6178796 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Copy.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyBlue.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyBlue.miff new file mode 100644 index 0000000..010feb7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyBlue.miff differ 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 0000000..c036f1a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyGreen.miff differ 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 0000000..70e2f54 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyOpacity.miff differ 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 0000000..4a6055a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/CopyRed.miff differ 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 0000000..a508094 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Difference.miff differ 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 0000000..8f92fd7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/In.miff differ 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 0000000..da1afda Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Minus.miff differ 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 0000000..ffb4204 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Multiply.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Out.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Out.miff new file mode 100644 index 0000000..47a9508 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Out.miff differ 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 0000000..6178796 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Over.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Plus.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Plus.miff new file mode 100644 index 0000000..ed087f7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/composite/Plus.miff differ 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=WT>>>>>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 0000000..1ef75c0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/idat_tmp.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray.miff new file mode 100644 index 0000000..2e7732c --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray.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_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_idat.miff new file mode 100644 index 0000000..af1c11c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_idat.miff differ 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 0000000..e8d1189 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_jdaa.miff differ 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 0000000..af1c11c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_idat.miff differ 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 0000000..e8d1189 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_gray_prog_jdaa.miff differ 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 0000000..621c674 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_idat.miff differ 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 0000000..9158c23 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_jdaa.miff differ 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 0000000..621c674 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_idat.miff differ 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 0000000..9158c23 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/input_prog_jdaa.miff differ 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 0000000..3bdfa32 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/jdaa_tmp.miff differ 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 0000000..1ef75c0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_idat_tmp.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_jdaa_tmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_jdaa_tmp.miff new file mode 100644 index 0000000..3bdfa32 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/prog_jdaa_tmp.miff differ 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 0000000..2c19099 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_idat.miff differ 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 0000000..4797325 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_jdaa.miff differ 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 0000000..2c19099 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_idat.miff differ 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 0000000..4797325 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_gray_prog_jdaa.miff differ 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 0000000..3aabb1a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_idat.miff differ 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 0000000..a24c98d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_jdaa.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog.miff new file mode 100644 index 0000000..e7b2c7f --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_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 + +:5,#6-&7/,91/;25;2382283/64(42#32 10.///#00&5-+>*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 0000000..3aabb1a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_idat.miff differ 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 0000000..a24c98d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/read_prog_jdaa.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray.miff new file mode 100644 index 0000000..8d4383a --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray.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_idat.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_idat.miff new file mode 100644 index 0000000..3dd4ef0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_idat.miff differ 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 0000000..86082dc Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_jdaa.miff differ 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 0000000..3dd4ef0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_idat.miff differ 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 0000000..86082dc Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_gray_prog_jdaa.miff differ 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 0000000..0d2b689 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_idat.miff differ 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 0000000..5326e6c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_jdaa.miff differ 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 0000000..0d2b689 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_idat.miff differ 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 0000000..5326e6c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jng/write_prog_jdaa.miff differ 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 0000000..4067846 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jp2.miff differ 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 0000000..4067846 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_jpc.miff differ 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 0000000..1284a4a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jp2/read_pgx.miff differ 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 0000000..806e109 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_non_interlaced.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_plane_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_plane_interlaced.miff new file mode 100644 index 0000000..806e109 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/read_plane_interlaced.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_non_interlaced.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_non_interlaced.miff new file mode 100644 index 0000000..9813a40 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_non_interlaced.miff differ 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 0000000..9813a40 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/jpeg/write_plane_interlaced.miff differ 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 0000000..2b28e3d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/output_p7.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/gradient.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/gradient.miff new file mode 100644 index 0000000..2ff85ca Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/gradient.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/granite.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/granite.miff new file mode 100644 index 0000000..bde918d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/granite.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_avs.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_avs.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_avs.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp.miff new file mode 100644 index 0000000..c2aa7e9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp.miff differ 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 0000000..f2b3257 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_bmp24.miff differ 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 0000000..1fa2c15 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_cmyk.miff differ 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 0000000..3333237 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dcx.miff differ 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 0000000..f2b3257 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_dib.miff differ 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 0000000..c33d150 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_fits.miff differ 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 0000000..7b03270 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif87.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif87.miff new file mode 100644 index 0000000..7b03270 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gif87.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gray.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gray.miff new file mode 100644 index 0000000..c9499d4 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_gray.miff differ 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 0000000..7cc8cd9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ico.miff differ 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 0000000..b92a698 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im1.miff differ 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 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im24.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im8.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im8.miff new file mode 100644 index 0000000..8e8c153 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_im8.miff differ 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 0000000..35e2c8d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mat.miff differ 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 0000000..0316d8a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_miff.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mtv.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mtv.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_mtv.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_DarkOrange.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_DarkOrange.miff new file mode 100644 index 0000000..4b14c0e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_DarkOrange.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_black.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_black.miff new file mode 100644 index 0000000..4b14c0e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_black.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_white.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_white.miff new file mode 100644 index 0000000..4b14c0e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_null_white.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_p7.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_p7.miff new file mode 100644 index 0000000..831c3e7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_p7.miff differ 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 0000000..a8decd1 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p1.miff differ 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 0000000..a8decd1 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pbm_p4.miff differ 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 0000000..3333237 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pcx.miff differ 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 0000000..d8f4ac8 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p2.miff differ 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 0000000..d8f4ac8 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pgm_p5.miff differ 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 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_pict.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p3.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p3.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p3.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p6.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p6.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_ppm_p6.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_psd.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_psd.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_psd.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgb.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgb.miff new file mode 100644 index 0000000..7106f7a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgb.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgba.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgba.miff new file mode 100644 index 0000000..ecfe26e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rgba.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rle.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rle.miff new file mode 100644 index 0000000..c97d0ad Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_rle.miff differ 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 0000000..03f4c9c Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_sgi.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tga.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tga.miff new file mode 100644 index 0000000..562f62f Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tga.miff differ 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 0000000..dd7674e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tile.miff differ 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 0000000..c51dee9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_tim.miff differ 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 0000000..acfb87a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_uyvy.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_viff.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_viff.miff new file mode 100644 index 0000000..1f24939 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_viff.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wbmp.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wbmp.miff new file mode 100644 index 0000000..4a43e39 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wbmp.miff differ 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 0000000..8cfd8f2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_wpg.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xbm.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xbm.miff new file mode 100644 index 0000000..f1825a2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xbm.miff differ 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 0000000..259f7c4 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xc_black.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xpm.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xpm.miff new file mode 100644 index 0000000..8e8c153 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xpm.miff differ 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 0000000..544dbc3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/read/input_xwd.miff differ 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 0000000..6227c16 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/annotate.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/label.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/label.miff new file mode 100644 index 0000000..9a3fd7d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/label.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/read.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/read.miff new file mode 100644 index 0000000..62f5f54 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/ttf/read.miff @@ -0,0 +1,950 @@ +id=ImageMagick version=1.0 +class=DirectClass colors=0 matte=True +columns=800 rows=480 depth=8 +colorspace=RGB +resolution=72x72 +page=800x480+0+0 + +:KKK$$$KKK111JJJuuuQQQ... rrrvvv%%%$$$WWWttt vvv$$$ $$$rrrkkk gggKKK\\\&&&))),,,hhh@@@&&&  gggwwwnnnhhh RRR + + +EEEyyy + + +,,,UUUZZZ VVVRRR'''rrr + + +,,,NNN)))RRRJJJyyylllRRR[[[```###nnn %%%>>>SSSwwwUUU```HHH:::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 0000000..3a0df1d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/clock.miff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/wizard.miff b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/wizard.miff new file mode 100644 index 0000000..cb39566 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/reference/write/wmf/wizard.miff differ 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 0000000..b591be0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16.tiff differ 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 0000000..c705f06 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_16_matte.tiff differ 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 0000000..4e976e5 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256.tiff differ 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 0000000..ff71ae7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_matte.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_contig.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_contig.tiff new file mode 100644 index 0000000..b8fd1ea Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_contig.tiff differ 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 0000000..df4432a Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_256_planar_separate.tiff differ 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 0000000..6774cb7 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_12bit.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_16bit.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_16bit.tiff new file mode 100644 index 0000000..c2530b0 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_16bit.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit.tiff new file mode 100644 index 0000000..57008f8 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit_matte.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit_matte.tiff new file mode 100644 index 0000000..08426d1 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_4bit_matte.tiff differ 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 0000000..60294b3 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit.tiff differ 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 0000000..96c5241 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_gray_8bit_matte.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_mono.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_mono.tiff new file mode 100644 index 0000000..2e4b21d Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_mono.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor.tiff new file mode 100644 index 0000000..7ebb877 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_16.tiff b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_16.tiff new file mode 100644 index 0000000..9f9fd5e Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_16.tiff differ 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 0000000..98a6722 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_stripped.tiff differ 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 0000000..2f62fe9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/input_truecolor_tiled32x32.tiff differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/tiff/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/read.t new file mode 100644 index 0000000..651eb6e --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/tiff/read.t @@ -0,0 +1,147 @@ +#!/usr/bin/perl +# +# Test reading TIFF images +# +# Contributed by Bob Friesenhahn +# +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 0000000..8ea6470 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/ttf/input.ttf differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/ttf/read.t b/ImageMagick-6.9.12-44/PerlMagick/t/ttf/read.t new file mode 100644 index 0000000..91f76a7 --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/ttf/read.t @@ -0,0 +1,51 @@ +#!/usr/bin/perl +# +# Test read image method on TrueType font +# +# Contributed by Bob Friesenhahn '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 0000000..dead7d9 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/clock.wmf differ 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 0000000..6d898e4 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/wmf/wizard.wmf differ diff --git a/ImageMagick-6.9.12-44/PerlMagick/t/write.t b/ImageMagick-6.9.12-44/PerlMagick/t/write.t new file mode 100644 index 0000000..e901c0d --- /dev/null +++ b/ImageMagick-6.9.12-44/PerlMagick/t/write.t @@ -0,0 +1,267 @@ +#!/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 writing formats supported directly by ImageMagick +# + +BEGIN { $| = 1; $test=1; print "1..32\n"; } +END {print "not ok $test\n" unless $loaded;} +use Image::Magick; +$loaded=1; + +require 't/subroutines.pl'; + +chdir 't' || die 'Cd failed'; + +print("AVS X image file ...\n"); +testReadWrite( 'AVS:input.avs', + 'AVS:output.avs', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Microsoft Windows bitmap image file ...\n"); +++$test; +testReadWrite( 'BMP:input.bmp', + 'BMP:output.bmp', + q//, + '5a25065144213cd0230b7572bd9aef0e447c23a0622193a94ae62c9895c44bf7'); + +print("Microsoft Windows 24-bit bitmap image file ...\n"); +++$test; +testReadWrite( 'BMP:input.bmp24', + 'BMP:output.bmp24', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + + +print("ZSoft IBM PC multi-page Paintbrush file ...\n"); +++$test; +testReadWrite( 'DCX:input.dcx', + 'DCX:output.dcx', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Microsoft Windows 3.X DIB file ...\n"); +++$test; +testReadWrite( 'DIB:input.dib', + 'DIB:output.dib', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Flexible Image Transport System ...\n"); +++$test; +testReadWrite( 'FITS:input.fits', + 'FITS:output.fits', + q//, + 'f44631f7eec8311b2e0d8d2567ace65e55f6cf42378e777bccb705160587228b' ); + +print("CompuServe graphics interchange format ...\n"); +++$test; +testReadWrite( 'GIF:input.gif', + 'GIF:output.gif', + q//, + '5a25065144213cd0230b7572bd9aef0e447c23a0622193a94ae62c9895c44bf7' ); + +print("CompuServe graphics interchange format (1987) ...\n"); +++$test; +testReadWrite( 'GIF87:input.gif87', + 'GIF87:output.gif87', + q//, + '0138e1e5c9a7ed1604ec5bbe8c22378b84fcd9abb8c36e984b051f9efc14d54e' ); + +print("Magick image file format ...\n"); +++$test; +testReadWrite( 'MIFF:input.miff', + 'MIFF:output.miff', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("MTV Raytracing image format ...\n"); +++$test; +testReadWrite( 'MTV:input.mtv', + 'MTV:output.mtv', + q//, + 'a698f2fe0c6c31f83d19554a6ec02bac79c961dd9a87e7ed217752e75eb615d7'); + +print("Portable bitmap format (black and white), ASCII format ...\n"); +++$test; +testReadWrite( 'PBM:input_p1.pbm', + 'PBM:output_p1.pbm', + q/compression=>'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 0000000..13a67c2 Binary files /dev/null and b/ImageMagick-6.9.12-44/PerlMagick/t/x11/input.xwd differ 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]e@aeFVV=WT +# + +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 +# , /