png.c revision 217484eb7236f4f3527af0feb39a6dc19a3302fe
13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PPPP N N GGGG % 73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P P NN N G % 83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PPPP N N N G GG % 93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P N NN G G % 103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% P N N GGG % 113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Read/Write Portable Network Graphics Image Format % 143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Software Design % 163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% John Cristy % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Glenn Randers-Pehrson % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% November 1997 % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 2116af1cbdffcc02e7239d432e5fb51734fcf9f9ffcristy% Copyright 1999-2010 ImageMagick Studio LLC, a non-profit organization % 223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% dedicated to making software imaging solutions freely available. % 233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% You may not use this file except in compliance with the License. You may % 253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% obtain a copy of the License at % 263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% http://www.imagemagick.org/script/license.php % 283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Unless required by applicable law or agreed to in writing, software % 303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% distributed under the License is distributed on an "AS IS" BASIS, % 313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% See the License for the specific language governing permissions and % 333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% limitations under the License. % 343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Include declarations. 433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/studio.h" 455a2ca481ab4ff6751bba842263739966e53441aacristy#include "magick/attribute.h" 463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob.h" 473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/blob-private.h" 483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/cache.h" 493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/color.h" 503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/color-private.h" 514ccd4c0b8623aa47f1c10dd366666799e5957c3ccristy#include "magick/colormap.h" 523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/colorspace.h" 533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/constitute.h" 543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/enhance.h" 553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception.h" 563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/exception-private.h" 573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/geometry.h" 58f2e1166e90de2dfe2e6a2aed7cd5f73640f34a7acristy#include "magick/histogram.h" 593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image.h" 603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/image-private.h" 613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/layer.h" 623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/list.h" 633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/log.h" 643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/magick.h" 653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/memory_.h" 663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/module.h" 673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor.h" 683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/monitor-private.h" 693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/option.h" 703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantum-private.h" 713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/profile.h" 723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/property.h" 733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantize.h" 743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/resource_.h" 753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/semaphore.h" 763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/quantum-private.h" 773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/static.h" 783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/statistic.h" 793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/string_.h" 80f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy#include "magick/string-private.h" 813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/transform.h" 823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "magick/utility.h" 833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 84286a6355c4544b794da2b6df973faad07c69e541glennrp 857ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp/* Suppress libpng pedantic warnings that were added in 867ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp * libpng-1.2.41 and libpng-1.4.0. If you are working on 87faa852bad40107edae19405e76a299057668d795glennrp * migration to libpng-1.5, remove these defines and then 887ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp * fix any code that generates warnings. 897ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp */ 90991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp/* #define PNG_DEPRECATED Use of this function is deprecated */ 91faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_USE_RESULT The result of this function must be checked */ 92faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_NORETURN This function does not return */ 93faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_ALLOCATED The result of the function is new memory */ 94faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_DEPSTRUCT Access to this struct member is deprecated */ 95286a6355c4544b794da2b6df973faad07c69e541glennrp 963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "png.h" 973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "zlib.h" 983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ImageMagick differences */ 1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define first_scene scene 1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 102d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Optional declarations. Define or undefine them as you like. 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* #define PNG_DEBUG -- turning this on breaks VisualC compiling */ 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Features under construction. Define these to work on them. 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_OBJECT_BUFFERS 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_BASI_SUPPORTED 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_COALESCE_LAYERS /* In 5.4.4, this interfered with MMAP'ed files. */ 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_INSERT_LAYERS /* Troublesome, but seem to work as of 5.4.4 */ 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_BUILD_PALETTE /* This works as of 5.4.3. */ 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_SORT_PALETTE /* This works as of 5.4.0. */ 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_JPEG_DELEGATE) 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define JNG_SUPPORTED /* Not finished as of 5.5.2. See "To do" comments. */ 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(RGBColorMatchExact) 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define IsPNGColorEqual(color,target) \ 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (((color).red == (target).red) && \ 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((color).green == (target).green) && \ 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((color).blue == (target).blue)) 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Establish thread safety. 1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is claimed to be safe on these platforms: 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is alleged to be unsafe on these platforms: 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef SETJMP_IS_THREAD_SAFE 1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_SETJMP_NOT_THREAD_SAFE 1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo 1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png_semaphore = (SemaphoreInfo *) NULL; 1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This temporary until I set up malloc'ed object attributes array. 1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Recompile with MNG_MAX_OBJECTS=65536L to avoid this limit but 1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy waste more memory. 1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_MAX_OBJECTS 256 1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If this not defined, spec is interpreted strictly. If it is 1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined, an attempt will be made to recover from some errors, 1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy including 1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o global PLTE too short 1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_LOOSE 1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Don't try to define PNG_MNG_FEATURES_SUPPORTED here. Make sure 1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy it's defined in libpng/pngconf.h, version 1.0.9 or later. It won't work 1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy with earlier versions of libpng. From libpng-1.0.3a to libpng-1.0.8, 1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_READ|WRITE_EMPTY_PLTE were used but those have been deprecated in 1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy libpng in favor of PNG_MNG_FEATURES_SUPPORTED, so we set them here. 1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_MNG_FEATURES_SUPPORTED is disabled by default in libpng-1.0.9 and 1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy will be enabled by default in libpng-1.2.0. 1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_MNG_FEATURES_SUPPORTED 1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_READ_EMPTY_PLTE_SUPPORTED 1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_WRITE_EMPTY_PLTE_SUPPORTED 1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_WRITE_EMPTY_PLTE_SUPPORTED 1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 175bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Maximum valid size_t in PNG/MNG chunks is (2^31)-1 1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This macro is only defined in libpng-1.0.3 and later. 1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Previously it was PNG_MAX_UINT but that was deprecated in libpng-1.2.6 1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_UINT_31_MAX 1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_UINT_31_MAX (png_uint_32) 0x7fffffffL 1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Constant strings for known chunk types. If you need to add a chunk, 1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy add a string holding the name here. To make the code more 1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy portable, we use ASCII numbers like this, not characters. 1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_MHDR[5]={ 77, 72, 68, 82, (png_byte) '\0'}; 1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_BACK[5]={ 66, 65, 67, 75, (png_byte) '\0'}; 1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_BASI[5]={ 66, 65, 83, 73, (png_byte) '\0'}; 1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_CLIP[5]={ 67, 76, 73, 80, (png_byte) '\0'}; 1933ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_CLON[5]={ 67, 76, 79, 78, (png_byte) '\0'}; 1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_DEFI[5]={ 68, 69, 70, 73, (png_byte) '\0'}; 1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_DHDR[5]={ 68, 72, 68, 82, (png_byte) '\0'}; 1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_DISC[5]={ 68, 73, 83, 67, (png_byte) '\0'}; 1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_ENDL[5]={ 69, 78, 68, 76, (png_byte) '\0'}; 1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_FRAM[5]={ 70, 82, 65, 77, (png_byte) '\0'}; 1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_IEND[5]={ 73, 69, 78, 68, (png_byte) '\0'}; 2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_IHDR[5]={ 73, 72, 68, 82, (png_byte) '\0'}; 2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_JHDR[5]={ 74, 72, 68, 82, (png_byte) '\0'}; 2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_LOOP[5]={ 76, 79, 79, 80, (png_byte) '\0'}; 2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_MAGN[5]={ 77, 65, 71, 78, (png_byte) '\0'}; 2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_MEND[5]={ 77, 69, 78, 68, (png_byte) '\0'}; 2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_MOVE[5]={ 77, 79, 86, 69, (png_byte) '\0'}; 2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_PAST[5]={ 80, 65, 83, 84, (png_byte) '\0'}; 2073ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_PLTE[5]={ 80, 76, 84, 69, (png_byte) '\0'}; 2083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_SAVE[5]={ 83, 65, 86, 69, (png_byte) '\0'}; 2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_SEEK[5]={ 83, 69, 69, 75, (png_byte) '\0'}; 2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_SHOW[5]={ 83, 72, 79, 87, (png_byte) '\0'}; 2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_TERM[5]={ 84, 69, 82, 77, (png_byte) '\0'}; 2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_bKGD[5]={ 98, 75, 71, 68, (png_byte) '\0'}; 2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_cHRM[5]={ 99, 72, 82, 77, (png_byte) '\0'}; 2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_gAMA[5]={103, 65, 77, 65, (png_byte) '\0'}; 2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; 2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_nEED[5]={110, 69, 69, 68, (png_byte) '\0'}; 2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_pHYg[5]={112, 72, 89, 103, (png_byte) '\0'}; 2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; 2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_pHYs[5]={112, 72, 89, 115, (png_byte) '\0'}; 2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_sBIT[5]={115, 66, 73, 84, (png_byte) '\0'}; 2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_sRGB[5]={115, 82, 71, 66, (png_byte) '\0'}; 2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_tRNS[5]={116, 82, 78, 83, (png_byte) '\0'}; 2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_IDAT[5]={ 73, 68, 65, 84, (png_byte) '\0'}; 2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_JDAT[5]={ 74, 68, 65, 84, (png_byte) '\0'}; 2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_JDAA[5]={ 74, 68, 65, 65, (png_byte) '\0'}; 2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_JdAA[5]={ 74, 100, 65, 65, (png_byte) '\0'}; 2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_JSEP[5]={ 74, 83, 69, 80, (png_byte) '\0'}; 2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_oFFs[5]={111, 70, 70, 115, (png_byte) '\0'}; 2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristyOther known chunks that are not yet supported by ImageMagick: 2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_hIST[5]={104, 73, 83, 84, (png_byte) '\0'}; 2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; 2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_iTXt[5]={105, 84, 88, 116, (png_byte) '\0'}; 2383ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_sPLT[5]={115, 80, 76, 84, (png_byte) '\0'}; 2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_sTER[5]={115, 84, 69, 82, (png_byte) '\0'}; 2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_tEXt[5]={116, 69, 88, 116, (png_byte) '\0'}; 2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_tIME[5]={116, 73, 77, 69, (png_byte) '\0'}; 2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_byte FARDATA mng_zTXt[5]={122, 84, 88, 116, (png_byte) '\0'}; 2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24505eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrptypedef struct _UShortPixelPacket 24605eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp{ 24705eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp unsigned short 24805eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp red, 24905eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp green, 25005eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp blue, 25105eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp opacity, 25205eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp index; 25305eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp} UShortPixelPacket; 25405eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp 2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBox 2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 2578182b0758e3429fb8dcd1700f09643fd4d80a41ccristy long 2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy left, 2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy right, 2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy top, 2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bottom; 2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBox; 2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngPair 2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 2668182b0758e3429fb8dcd1700f09643fd4d80a41ccristy volatile long 2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a, 2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy b; 2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngPair; 2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBuffer 2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 275bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height, 2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width; 2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color 2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte[256]; 2843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_count; 2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_sample_depth, 2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression_method, 2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_type, 2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy concrete, 2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy filter_method, 2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen, 2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_type, 2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy interlace_method, 2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel_sample_depth, 2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte_length, 2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sample_depth, 3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable; 3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBuffer; 3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngInfo 3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBuffer 3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ob[MNG_MAX_OBJECTS]; 3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image * 3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image; 3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy page; 3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy adjoin, 3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_in_read_buffer, 3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy found_empty_plte, 3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_backgrounds, 3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_chrms, 3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_gammas, 3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_palettes, 3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_physs, 3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_srgbs, 3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode, 3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_bkgd, 3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_chrm, 3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_gama, 3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_phys, 3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_sbit, 3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_srgb, 3403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_saved_bkgd_index, 3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_chrm, 3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_gama, 3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_plte, 3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_srgb, 3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_fram, 3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_framing_mode, 3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy optimize, 3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy saved_bkgd_index; 3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors; 3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 354bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_found, 3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_count[256], 3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_iteration[256], 3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scenes_found, 3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_off[MNG_MAX_OBJECTS], 3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_off[MNG_MAX_OBJECTS]; 3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clip, 3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame, 3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_box, 3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_clip[MNG_MAX_OBJECTS]; 3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* These flags could be combined into one byte */ 3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exists[MNG_MAX_OBJECTS], 3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen[MNG_MAX_OBJECTS], 3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_active[256], 3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy invisible[MNG_MAX_OBJECTS], 3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable[MNG_MAX_OBJECTS]; 3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_jump[256]; 3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte; 3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_8 3833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_sbit; 3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_buffer[8], 3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns[256]; 3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy float 3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_gamma; 3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ChromaticityInfo 3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_chrm; 3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RenderingIntent 3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_srgb_intent; 3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40035ef824baa82511126ff0072ae30eee0da9c05a3cristy unsigned int 4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy delay, 4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte_length, 4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns_length, 4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_x_pixels_per_unit, 4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_y_pixels_per_unit, 4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_width, 4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_height, 4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ticks_per_second; 4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IsPalette, 4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_phys_unit_type, 4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_warning, 4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clon_warning, 4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dhdr_warning, 4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jhdr_warning, 4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_warning, 4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy past_warning, 4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phyg_warning, 4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phys_warning, 4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sbit_warning, 4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy show_warning, 4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type, 4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng, 4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_colortype, 4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_depth, 4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png8, 4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png24, 4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png32; 4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 432bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_width, 4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_height; 4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_depth, 4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type, 4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method, 4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type, 4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method, 4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red, 4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green, 4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue, 4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha, 4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable; 4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PixelPacket 4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_global_bkgd; 4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngInfo; 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* VER */ 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy WritePNGImage(const ImageInfo *,Image *); 4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy WriteMNGImage(const ImageInfo *,Image *); 4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy WriteJNGImage(const ImageInfo *,Image *); 4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 479e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic int 480e610a071534e448c46460a5aa39ede33bf56b329glennrpPNG_RenderingIntent_from_Magick_RenderingIntent(const RenderingIntent intent) 481e610a071534e448c46460a5aa39ede33bf56b329glennrp{ 482e610a071534e448c46460a5aa39ede33bf56b329glennrp switch (intent) 483e610a071534e448c46460a5aa39ede33bf56b329glennrp { 484e610a071534e448c46460a5aa39ede33bf56b329glennrp case PerceptualIntent: 485e610a071534e448c46460a5aa39ede33bf56b329glennrp return 0; 486e610a071534e448c46460a5aa39ede33bf56b329glennrp case RelativeIntent: 487e610a071534e448c46460a5aa39ede33bf56b329glennrp return 1; 488e610a071534e448c46460a5aa39ede33bf56b329glennrp case SaturationIntent: 489e610a071534e448c46460a5aa39ede33bf56b329glennrp return 2; 490e610a071534e448c46460a5aa39ede33bf56b329glennrp case AbsoluteIntent: 491e610a071534e448c46460a5aa39ede33bf56b329glennrp return 3; 492e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 493e610a071534e448c46460a5aa39ede33bf56b329glennrp return -1; 494e610a071534e448c46460a5aa39ede33bf56b329glennrp } 495e610a071534e448c46460a5aa39ede33bf56b329glennrp} 496e610a071534e448c46460a5aa39ede33bf56b329glennrp 497e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic RenderingIntent 498e610a071534e448c46460a5aa39ede33bf56b329glennrpPNG_RenderingIntent_to_Magick_RenderingIntent(const int png_intent) 499e610a071534e448c46460a5aa39ede33bf56b329glennrp{ 500e610a071534e448c46460a5aa39ede33bf56b329glennrp switch (png_intent) 501e610a071534e448c46460a5aa39ede33bf56b329glennrp { 502e610a071534e448c46460a5aa39ede33bf56b329glennrp case 0: 503e610a071534e448c46460a5aa39ede33bf56b329glennrp return PerceptualIntent; 504e610a071534e448c46460a5aa39ede33bf56b329glennrp case 1: 505e610a071534e448c46460a5aa39ede33bf56b329glennrp return RelativeIntent; 506e610a071534e448c46460a5aa39ede33bf56b329glennrp case 2: 507e610a071534e448c46460a5aa39ede33bf56b329glennrp return SaturationIntent; 508e610a071534e448c46460a5aa39ede33bf56b329glennrp case 3: 509e610a071534e448c46460a5aa39ede33bf56b329glennrp return AbsoluteIntent; 510e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 511e610a071534e448c46460a5aa39ede33bf56b329glennrp return UndefinedIntent; 512e610a071534e448c46460a5aa39ede33bf56b329glennrp } 513e610a071534e448c46460a5aa39ede33bf56b329glennrp} 514e610a071534e448c46460a5aa39ede33bf56b329glennrp 515bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline ssize_t MagickMax(const ssize_t x,const ssize_t y) 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x > y) 5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(x); 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(y); 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 521bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline ssize_t MagickMin(const ssize_t x,const ssize_t y) 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x < y) 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(x); 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(y); 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 528d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 5293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SORT_PALETTE) 5303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% C o m p r e s s C o l o r m a p T r a n s F i r s t % 5363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% CompressColormapTransFirst compresses an image colormap removing 5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% any duplicate and unused color entries and putting the transparent colors 5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% first. Returns MagickTrue on success, MagickFalse on error. 5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the CompressColormapTransFirst method is: 5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% unsigned int CompressColormapTransFirst(Image *image) 5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: the address of a structure of type Image. 55298156a3a465a004545e39434c63052b955a74d1cglennrp% This function updates image->colors and image->colormap. 5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType CompressColormapTransFirst(Image *image) 5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy remap_needed, 5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy k; 5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 561bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j, 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors, 5643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors, 5653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 5663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PixelPacket 5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *colormap; 5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const IndexPacket 5715c6f789db7a30bad01ace12b09ad9cd471339e94cristy *indexes; 5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 5743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 5753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexPacket 5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy top_used; 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 579bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexPacket 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *map, 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *opacity; 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *marker, 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_transparency; 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine if colormap can be compressed. 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 59798156a3a465a004545e39434c63052b955a74d1cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 598e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " CompressColorMapTransFirst %s (%.20g colors)",image->filename, 599e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->colors); 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class != PseudoClass || image->colors > 256 || 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors < 2) 60298156a3a465a004545e39434c63052b955a74d1cglennrp { 60398156a3a465a004545e39434c63052b955a74d1cglennrp if (image->debug != MagickFalse) 60498156a3a465a004545e39434c63052b955a74d1cglennrp { 60598156a3a465a004545e39434c63052b955a74d1cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 60698156a3a465a004545e39434c63052b955a74d1cglennrp " Could not compress colormap"); 60798156a3a465a004545e39434c63052b955a74d1cglennrp if (image->colors > 256 || image->colors == 0) 60898156a3a465a004545e39434c63052b955a74d1cglennrp return(MagickFalse); 60998156a3a465a004545e39434c63052b955a74d1cglennrp else 61098156a3a465a004545e39434c63052b955a74d1cglennrp return(MagickTrue); 61198156a3a465a004545e39434c63052b955a74d1cglennrp } 61298156a3a465a004545e39434c63052b955a74d1cglennrp } 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) AcquireQuantumMemory(image->colors,sizeof(*marker)); 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker == (unsigned char *) NULL) 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity=(IndexPacket *) AcquireQuantumMemory(image->colors,sizeof(*opacity)); 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (opacity == (IndexPacket *) NULL) 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) RelinquishMagickMemory(marker); 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Mark colors that are present. 6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 627bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy number_colors=(ssize_t) image->colors; 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker[i]=MagickFalse; 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity[i]=OpaqueOpacity; 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy top_used=0; 634bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6395c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes=GetVirtualIndexQueue(image); 6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 641bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6435c6f789db7a30bad01ace12b09ad9cd471339e94cristy marker[(int) indexes[x]]=MagickTrue; 6445c6f789db7a30bad01ace12b09ad9cd471339e94cristy opacity[(int) indexes[x]]=GetOpacityPixelComponent(p); 6455c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (indexes[x] > top_used) 6465c6f789db7a30bad01ace12b09ad9cd471339e94cristy top_used=indexes[x]; 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 650bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6525c6f789db7a30bad01ace12b09ad9cd471339e94cristy marker[(int) indexes[x]]=MagickTrue; 6535c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (indexes[x] > top_used) 6545c6f789db7a30bad01ace12b09ad9cd471339e94cristy top_used=indexes[x]; 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Mark background color, topmost occurrence if more than one. 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=number_colors-1; i; i--) 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsColorEqual(image->colormap+i,&image->background_color)) 6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker[i]=MagickTrue; 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Unmark duplicates. 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors-1; i++) 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker[i]) 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (j=i+1; j < number_colors; j++) 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((opacity[i] == opacity[j]) && 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (IsColorEqual(image->colormap+i,image->colormap+j))) 6813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker[j]=MagickFalse; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Count colors that still remain. 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_transparency=MagickFalse; 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors=0; 6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker[i]) 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors++; 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (opacity[i] != OpaqueOpacity) 6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_transparency=MagickTrue; 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!have_transparency || (marker[0] && 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (opacity[0] == (Quantum) TransparentOpacity))) 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy && (new_number_colors == number_colors)) 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy No duplicate or unused entries, and transparency-swap not needed. 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) RelinquishMagickMemory(marker); 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity=(IndexPacket *) RelinquishMagickMemory(opacity); 7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy remap_needed=MagickFalse; 708bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((ssize_t) top_used >= new_number_colors) 7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy remap_needed=MagickTrue; 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Compress colormap. 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(PixelPacket *) AcquireQuantumMemory(image->colors, 7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*colormap)); 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (colormap == (PixelPacket *) NULL) 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) RelinquishMagickMemory(marker); 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity=(IndexPacket *) RelinquishMagickMemory(opacity); 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Eliminate unused colormap entries. 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map=(IndexPacket *) AcquireQuantumMemory((size_t) number_colors, 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*map)); 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (map == (IndexPacket *) NULL) 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) RelinquishMagickMemory(marker); 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity=(IndexPacket *) RelinquishMagickMemory(opacity); 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(PixelPacket *) RelinquishMagickMemory(colormap); 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed", 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy k=0; 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map[i]=(IndexPacket) k; 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker[i]) 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (j=i+1; j < number_colors; j++) 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((opacity[i] == opacity[j]) && 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (IsColorEqual(image->colormap+i,image->colormap+j))) 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map[j]=(IndexPacket) k; 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker[j]=MagickFalse; 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy k++; 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j=0; 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker[i]) 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap[j]=image->colormap[i]; 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j++; 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (have_transparency && (opacity[0] != (Quantum) TransparentOpacity)) 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Move the first transparent color to palette entry 0. 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < number_colors; i++) 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (marker[i] && opacity[i] == (Quantum) TransparentOpacity) 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PixelPacket 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy temp_colormap; 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy temp_colormap=colormap[0]; 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap[0]=colormap[(int) map[i]]; 778bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy colormap[(ssize_t) map[i]]=temp_colormap; 7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (j=0; j < number_colors; j++) 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (map[j] == 0) 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map[j]=map[i]; 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (map[j] == map[i]) 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map[j]=0; 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy remap_needed=MagickTrue; 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity=(IndexPacket *) RelinquishMagickMemory(opacity); 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy marker=(unsigned char *) RelinquishMagickMemory(marker); 7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (remap_needed) 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *exception; 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register IndexPacket 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Remap pixels. 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception=(&image->exception); 810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=GetAuthenticIndexQueue(image); 816bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j=(int) pixels[x]; 8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels[x]=map[j]; 8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < new_number_colors; i++) 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i]=colormap[i]; 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy colormap=(PixelPacket *) RelinquishMagickMemory(colormap); 828bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->colors=(size_t) new_number_colors; 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy map=(IndexPacket *) RelinquishMagickMemory(map); 8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I m a g e I s G r a y % 8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Like IsGrayImage except does not change DirectClass to PseudoClass % 8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType ImageIsGray(Image *image) 8503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 8513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 854bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x, 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 866bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsGray(image->colormap+i) == MagickFalse) 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 8703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 871bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 8723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 876bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsGray(p) == MagickFalse) 8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I m a g e I s M o n o c h r o m e % 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Like IsMonochromeImage except does not change DirectClass to PseudoClass % 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% and is more accurate. % 8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType ImageIsMonochrome(Image *image) 9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 907bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x, 9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 9153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 9163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 918bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((IsGray(image->colormap+i) == MagickFalse) || 9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->colormap[i].red != 0) && 9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->colormap[i].red != (Quantum) QuantumRange))) 9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 927bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 932bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((p->red != 0) && (p->red != (Quantum) QuantumRange)) 9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsGray(p) == MagickFalse) 9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((p->opacity != OpaqueOpacity) && 9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p->opacity != (Quantum) TransparentOpacity)) 9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 946d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_PNG_DELEGATE */ 9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s M N G % 9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsMNG() returns MagickTrue if the image format type, identified by the 9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is MNG. 9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsMNG method is: 9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\212MNG\r\n\032\n",8) == 0) 9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s J N G % 9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsJNG() returns MagickTrue if the image format type, identified by the 9963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is JNG. 9973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 9983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsJNG method is: 9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 10143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\213JNG\r\n\032\n",8) == 0) 10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s P N G % 10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsPNG() returns MagickTrue if the image format type, identified by the 10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is PNG. 10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsPNG method is: 10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\211PNG\r\n\032\n",8) == 0) 10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1058d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER > 10011) 1059bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t WriteBlobMSBULong(Image *image,const size_t value) 10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[4]; 10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[0]=(unsigned char) (value >> 24); 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[1]=(unsigned char) (value >> 16); 10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[2]=(unsigned char) (value >> 8); 10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[3]=(unsigned char) value; 10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((size_t) WriteBlob(image,4,buffer)); 10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGLong(png_bytep p,png_uint_32 value) 10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGsLong(png_bytep p,png_int_32 value) 10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGShort(png_bytep p,png_uint_16 value) 10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGType(png_bytep p,png_bytep type) 10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(p,type,4*sizeof(png_byte)); 10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void LogPNGChunk(int logging, png_bytep type, size_t length) 11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1104e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Writing %c%c%c%c chunk, length: %.20g", 1105e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1107d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1113d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d P N G I m a g e % 11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadPNGImage() reads a Portable Network Graphics (PNG) or 11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file and returns it. It 11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% allocates the memory necessary for the new Image structure and returns a 11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pointer to the new image or set of images. 11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadPNGImage method is: 11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do, more or less in chronological order (as of version 5.5.2, 11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% November 26, 2002 -- glennrp -- see also "To do" under WriteMNGImage): 11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Get 16-bit cheap transparency working. 11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG decoding is supposed to be in full MNG-LC compliance) 11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG encoding should be in full MNG compliance) 11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide options for choice of background to use when the MNG BACK 11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk is not present or is not mandatory (i.e., leave transparent, 11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% user specified, MNG BACK, PNG bKGD) 11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Implement LOOP/ENDL [done, but could do discretionary loops more 11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% efficiently by linking in the duplicate frames.]. 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Decode and act on the MHDR simplicity profile (offer option to reject 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files or attempt to process them anyway when the profile isn't LC or VLC). 11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG without Delta-PNG. 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BACK [done a while ago except for background image ID] 11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MOVE [done 15 May 1999] 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o CLIP [done 15 May 1999] 11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o DISC [done 19 May 1999] 11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SAVE [partially done 19 May 1999 (marks objects frozen)] 11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SEEK [partially done 19 May 1999 (discard function only)] 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SHOW 11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PAST 11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BASI 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MNG-level tEXt/iTXt/zTXt 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYg 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYs 11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o sBIT 11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o bKGD 11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o iTXt (wait for libpng implementation). 11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use the scene signature to discover when an identical scene is 11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% being reused, and just point to the original image->exception instead 11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of storing another set of pixels. This not specific to MNG 11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% but could be applied generally. 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG with Delta-PNG. 11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG tEXt/iTXt/zTXt 11913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% We will not attempt to read files containing the CgBI chunk. 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% They are really Xcode files meant for display on the iPhone. 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% These are not valid PNG files and it is impossible to recover 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the orginal PNG from files that have been converted to Xcode-PNG, 11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% since irretrievable loss of color data has occurred due to the 11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% use of premultiplied alpha. 11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This the function that does the actual reading of data. It is 12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the same as the one supplied in libpng, except that it receives the 12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy datastream from the ReadBlob() function instead of standard input. 12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 12153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,data); 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy msg[MaxTextExtent]; 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(msg,MaxTextExtent, 1227e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "Expected %.20g bytes; found %.20g bytes",(double) length, 1228e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) check); 12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_warning(png_ptr,msg); 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PNG_READ_EMPTY_PLTE_SUPPORTED) && \ 12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !defined(PNG_MNG_FEATURES_SUPPORTED) 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* We use mng_get_data() instead of png_get_data() if we have a libpng 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * older than libpng-1.0.3a, which was the first to allow the empty 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * PLTE, or a newer libpng in which PNG_MNG_FEATURES_SUPPORTED was 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * ifdef'ed out. Earlier versions would crash if the bKGD chunk was 12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * encountered after an empty PLTE, so we have to look ahead for bKGD 12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * chunks and remove them from the datastream that is passed to libpng, 12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and store their contents for later use. 12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void mng_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1256bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i=0; 12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) png_get_io_ptr(png_ptr); 12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) mng_info->image; 12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (mng_info->bytes_in_read_buffer && length) 12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[i]=mng_info->read_buffer[i]; 12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer--; 12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length--; 12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i++; 12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,(char *) data); 12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 0)) 12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_PLTE,4) == 0) 12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickTrue; 12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_IEND,4) == 0) 12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 1)) 12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_bKGD,4) == 0) 12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->found_empty_plte) 13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Skip the bKGD data byte and CRC. 13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) 13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReadBlob(image,5,(char *) mng_info->read_buffer); 13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->saved_bkgd_index=mng_info->read_buffer[0]; 13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickTrue; 13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_put_data(png_structp png_ptr,png_bytep data,png_size_t length) 13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1329bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy check=(png_size_t) WriteBlob(image,(size_t) length,data); 13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"WriteBlob Failed"); 13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_flush_data(png_structp png_ptr) 13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_ptr; 13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int PalettesAreEqual(Image *a,Image *b) 13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1343bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a == (Image *) NULL) || (b == (Image *) NULL)) 13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->storage_class != PseudoClass || b->storage_class != PseudoClass) 13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->colors != b->colors) 13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 1352bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) a->colors; i++) 13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a->colormap[i].red != b->colormap[i].red) || 13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].green != b->colormap[i].green) || 13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].blue != b->colormap[i].blue)) 13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickTrue); 13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void MngInfoDiscardObject(MngInfo *mng_info,int i) 13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i && (i < MNG_MAX_OBJECTS) && (mng_info != (MngInfo *) NULL) && 13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i] && !mng_info->frozen[i]) 13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count > 0) 13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->reference_count--; 13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count == 0) 13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->image != (Image *) NULL) 13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->image=DestroyImage(mng_info->ob[i]->image); 13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=DestroyString(mng_info->ob[i]); 13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=(MngBuffer *) NULL; 13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i]=MagickFalse; 13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[i]=MagickFalse; 13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[i]=MagickFalse; 13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickFalse; 13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->x_off[i]=0; 13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->y_off[i]=0; 13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].left=0; 1389bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].top=0; 1391bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void MngInfoFreeStruct(MngInfo *mng_info,int *have_mng_structure) 13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*have_mng_structure && (mng_info != (MngInfo *) NULL)) 13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1399bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte != (png_colorp) NULL) 14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) 14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RelinquishMagickMemory(mng_info->global_plte); 14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) RelinquishMagickMemory(mng_info); 14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *have_mng_structure=MagickFalse; 14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_minimum_box(MngBox box1,MngBox box2) 14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box=box1; 14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.left < box2.left) 14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left=box2.left; 14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.top < box2.top) 14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top=box2.top; 14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.right > box2.right) 14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right=box2.right; 14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.bottom > box2.bottom) 14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom=box2.bottom; 14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return box; 14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_read_box(MngBox previous_box,char delta_type,unsigned char *p) 14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read clipping boundaries from DEFI, CLIP, FRAM, or PAST chunk. 14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1437bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.left=(ssize_t) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 1438bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.right=(ssize_t) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 1439bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.top=(ssize_t) ((p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11]); 1440bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.bottom=(ssize_t) ((p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15]); 14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left+=previous_box.left; 14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right+=previous_box.right; 14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top+=previous_box.top; 14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom+=previous_box.bottom; 14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(box); 14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngPair mng_read_pair(MngPair previous_pair,int delta_type, 14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char *p) 14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair; 14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1457bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Read two ssize_ts from CLON, MOVE or PAST chunk 14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 14598182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.a=(long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 14608182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.b=(long) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.a+=previous_pair.a; 14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.b+=previous_pair.b; 14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(pair); 14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14698182b0758e3429fb8dcd1700f09643fd4d80a41ccristystatic long mng_get_long(unsigned char *p) 14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14718182b0758e3429fb8dcd1700f09643fd4d80a41ccristy return((long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3])); 14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGErrorHandler(png_struct *ping,png_const_charp message) 14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_error_ptr(ping); 14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " libpng-%s error: %s", PNG_LIBPNG_VER_STRING,message); 14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(),CoderError, 14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy message,"`%s'",image->filename); 1485faa852bad40107edae19405e76a299057668d795glennrp#if PNG_LIBPNG_VER < 10500 14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy longjmp(ping->jmpbuf,1); 1487faa852bad40107edae19405e76a299057668d795glennrp#else 1488faa852bad40107edae19405e76a299057668d795glennrp png_longjmp(ping,1); 1489faa852bad40107edae19405e76a299057668d795glennrp#endif 14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGWarningHandler(png_struct *ping,png_const_charp message) 14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(message, "Missing PLTE before tRNS") == 0) 14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping, message); 14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_error_ptr(ping); 15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1502cc23b9a188db6b1f240825f6d4c52310f5f69765cristy " libpng-%s warning: %s", PNG_LIBPNG_VER_STRING,message); 15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(),CoderWarning, 15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy message,"`%s'",image->filename); 15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_voidp png_IM_malloc(png_structp png_ptr,png_uint_32 size) 15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (PNG_LIBPNG_VER < 10011) 15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_voidp 15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret; 15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_ptr=png_ptr; 15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ret=((png_voidp) AcquireMagickMemory((size_t) size)); 15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ret == NULL) 15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error("Insufficient memory."); 15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ret); 15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_ptr=png_ptr; 15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_voidp) AcquireMagickMemory((size_t) size)); 15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free a pointer. It is removed from the list at the same time. 15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic png_free_ptr png_IM_free(png_structp png_ptr,png_voidp ptr) 15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_ptr=png_ptr; 15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptr=RelinquishMagickMemory(ptr); 15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_free_ptr) NULL); 15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 15393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int 15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristypng_read_raw_profile(Image *image, const ImageInfo *image_info, 15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp text,int ii) 15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1544bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp; 15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register png_charp 15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp; 15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles; 15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0, 15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,10,11,12, 15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13,14,15}; 15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=text[ii].text+1; 15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for newline */ 15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != '\n') 15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for length */ 15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp == '\0' || *sp == ' ' || *sp == '\n') 15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 1575f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy length=(png_uint_32) StringToLong(sp); 15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != ' ' && *sp != '\n') 15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* allocate space */ 15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 0) 15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderWarning,"UnableToCopyProfile","`%s'","invalid profile length"); 15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=AcquireStringInfo(length); 15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile == (StringInfo *) NULL) 15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResourceLimitError,"MemoryAllocationFailed","`%s'", 15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "unable to copy profile"); 15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* copy profile, skipping white space and column 1 "=" signs */ 15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=GetStringInfoDatum(profile); 15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles=length*2; 1596bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) nibbles; i++) 15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') 15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*sp == '\0') 16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderWarning,"UnableToCopyProfile","`%s'","ran out of data"); 16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%2 == 0) 16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp=(unsigned char) (16*unhex[(int) *sp++]); 16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*dp++)+=unhex[(int) *sp++]; 16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy We have already read "Raw profile type. 16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageProfile(image,&text[ii].key[17],profile); 16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf(" Found a generic profile, type %s\n",&text[ii].key[17]); 16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return MagickTrue; 16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int read_vpag_chunk_callback(png_struct *ping, png_unknown_chunkp chunk) 16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* The unknown chunk structure contains the chunk data: 16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte name[5]; 16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte *data; 16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t size; 16353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note that libpng has already taken care of the CRC handling. 16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->name[0] != 118 || chunk->name[1] != 112 || 16413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk->name[2] != 65 ||chunk-> name[3] != 103) 16423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* Did not recognize */ 16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* recognized vpAg */ 16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->size != 9) 16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(-1); /* Error return */ 16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->data[8] != 0) 16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* ImageMagick requires pixel units */ 16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_user_chunk_ptr(ping); 16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1654bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.width=(size_t) ((chunk->data[0] << 24) | 16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[1] << 16) | (chunk->data[2] << 8) | chunk->data[3]); 1656bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.height=(size_t) ((chunk->data[4] << 24) | 16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[5] << 16) | (chunk->data[6] << 8) | chunk->data[7]); 16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Return one of the following: */ 16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(-n); chunk had an error */ 16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(0); did not recognize */ 16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(n); success */ 16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(1); 16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e P N G I m a g e % 16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOnePNGImage() reads a Portable Network Graphics (PNG) image file 16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 16823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOnePNGImage method is: 16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOnePNGImage(MngInfo *mng_info, const ImageInfo *image_info, 16883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 16893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 16913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOnePNGImage(MngInfo *mng_info, 17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Read one PNG image */ 17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_text, 17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 1711faa852bad40107edae19405e76a299057668d795glennrp pass, 1712faa852bad40107edae19405e76a299057668d795glennrp ping_bit_depth, 1713faa852bad40107edae19405e76a299057668d795glennrp ping_color_type, 1714faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method, 1715faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method, 1716faa852bad40107edae19405e76a299057668d795glennrp ping_filter_method, 1717faa852bad40107edae19405e76a299057668d795glennrp ping_num_trans; 17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 172205eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp UShortPixelPacket 17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color; 17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1725faa852bad40107edae19405e76a299057668d795glennrp png_bytep 1726faa852bad40107edae19405e76a299057668d795glennrp ping_trans_alpha; 1727faa852bad40107edae19405e76a299057668d795glennrp 1728faa852bad40107edae19405e76a299057668d795glennrp png_color_16p 1729faa852bad40107edae19405e76a299057668d795glennrp ping_background, 1730faa852bad40107edae19405e76a299057668d795glennrp ping_trans_color; 1731faa852bad40107edae19405e76a299057668d795glennrp 17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *end_info, 17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1742faa852bad40107edae19405e76a299057668d795glennrp png_uint_32 1743faa852bad40107edae19405e76a299057668d795glennrp ping_height, 1744faa852bad40107edae19405e76a299057668d795glennrp ping_width, 1745faa852bad40107edae19405e76a299057668d795glennrp ping_rowbytes; 1746faa852bad40107edae19405e76a299057668d795glennrp 17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png_pixels; 17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1753bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register IndexPacket 17605c6f789db7a30bad01ace12b09ad9cd471339e94cristy *indexes; 17613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1762bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1772bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset; 17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte unused_chunks[]= 17773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 104, 73, 83, 84, (png_byte) '\0', /* hIST */ 17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ 17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ 17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ 17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ 17833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116, 73, 77, 69, (png_byte) '\0', /* tIME */ 17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " enter ReadOnePNGImage()"); 17893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 1791f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(png_semaphore); 17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 179425c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if (PNG_LIBPNG_VER < 10200) 17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 17993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 180061b4c957269727a0a2526edc2331881da8346100glennrp#if (PNG_LIBPNG_VER >= 10400) 180161b4c957269727a0a2526edc2331881da8346100glennrp# ifndef PNG_TRANSFORM_GRAY_TO_RGB /* Added at libpng-1.4.0beta67 */ 180261b4c957269727a0a2526edc2331881da8346100glennrp if (image_info->verbose) 180361b4c957269727a0a2526edc2331881da8346100glennrp { 180461b4c957269727a0a2526edc2331881da8346100glennrp printf("Your PNG library (libpng-%s) is an old beta version.\n", 180561b4c957269727a0a2526edc2331881da8346100glennrp PNG_LIBPNG_VER_STRING); 180661b4c957269727a0a2526edc2331881da8346100glennrp printf("Please update it.\n"); 180761b4c957269727a0a2526edc2331881da8346100glennrp } 180861b4c957269727a0a2526edc2331881da8346100glennrp# endif 180961b4c957269727a0a2526edc2331881da8346100glennrp#endif 181061b4c957269727a0a2526edc2331881da8346100glennrp 181161b4c957269727a0a2526edc2331881da8346100glennrp 1812ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy quantum_info = (QuantumInfo *) NULL; 18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping=png_create_read_struct_2(PNG_LIBPNG_VER_STRING, image, 18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGErrorHandler,PNGWarningHandler, NULL, 18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_malloc_ptr) png_IM_malloc,(png_free_ptr) png_IM_free); 18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping=png_create_read_struct(PNG_LIBPNG_VER_STRING,image, 18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGErrorHandler,PNGWarningHandler); 18253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,(png_info **) NULL,(png_info **) NULL); 18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy end_info=png_create_info_struct(ping); 18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (end_info == (png_info *) NULL) 18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,(png_info **) NULL); 18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) NULL; 1841faa852bad40107edae19405e76a299057668d795glennrp if (setjmp(png_jmpbuf(ping))) 18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 18443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG image is corrupt. 18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 1848f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() with error."); 18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 18547b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy { 18557b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy InheritException(exception,&image->exception); 18567b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy image->columns=0; 18577b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy } 18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for reading. 18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1863faa852bad40107edae19405e76a299057668d795glennrp 18643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 18653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sig_bytes(ping,8); 18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 18673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) 18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,mng_info,mng_get_data); 18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Ignore unused chunks and all unknown chunks except for vpAg */ 18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, NULL, 0); 18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 2, mng_vpAg, 1); 18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, unused_chunks, 18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int)sizeof(unused_chunks)/5); 18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Callback for other unknown chunks */ 18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_user_chunk_fn(ping, image, read_vpag_chunk_callback); 18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1897991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp#if (PNG_LIBPNG_VER < 10400) 1898991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# if defined(PNG_USE_PNGGCCRD) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ 1899991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp (PNG_LIBPNG_VER >= 10200) && (PNG_LIBPNG_VER < 10220) && defined(__i386__) 19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Disable thread-unsafe features of pnggccrd */ 19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_access_version_number() >= 10200) 19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 mmx_disable_mask=0; 19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 asm_flags; 19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ 19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ 19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ 19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); 19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy asm_flags=png_get_asm_flags(ping); 19113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_asm_flags(ping, asm_flags & ~mmx_disable_mask); 19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1913991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# endif 19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_info(ping,ping_info); 1917faa852bad40107edae19405e76a299057668d795glennrp 1918faa852bad40107edae19405e76a299057668d795glennrp png_get_IHDR(ping,ping_info,&ping_width,&ping_height, 1919faa852bad40107edae19405e76a299057668d795glennrp &ping_bit_depth,&ping_color_type, 1920faa852bad40107edae19405e76a299057668d795glennrp &ping_interlace_method,&ping_compression_method, 1921faa852bad40107edae19405e76a299057668d795glennrp &ping_filter_method); 1922faa852bad40107edae19405e76a299057668d795glennrp 1923faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_tRNS(ping, ping_info, &ping_trans_alpha, &ping_num_trans, 1924faa852bad40107edae19405e76a299057668d795glennrp &ping_trans_color); 1925faa852bad40107edae19405e76a299057668d795glennrp 1926faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_bKGD(ping, ping_info, &ping_background); 1927faa852bad40107edae19405e76a299057668d795glennrp 1928faa852bad40107edae19405e76a299057668d795glennrp if (ping_bit_depth < 8) 19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1930faa852bad40107edae19405e76a299057668d795glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) 1931faa852bad40107edae19405e76a299057668d795glennrp { 1932faa852bad40107edae19405e76a299057668d795glennrp png_set_packing(ping); 1933faa852bad40107edae19405e76a299057668d795glennrp ping_bit_depth = 8; 1934faa852bad40107edae19405e76a299057668d795glennrp } 19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1936faa852bad40107edae19405e76a299057668d795glennrp 1937faa852bad40107edae19405e76a299057668d795glennrp image->depth=ping_bit_depth; 19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=GetImageQuantumDepth(image,MagickFalse); 1939faa852bad40107edae19405e76a299057668d795glennrp image->interlace=ping_interlace_method != 0 ? PNGInterlace : NoInterlace; 19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1943e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " PNG width: %.20g, height: %.20g", 1944e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) ping_width, (double) ping_height); 19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG color_type: %d, bit_depth: %d", 1947faa852bad40107edae19405e76a299057668d795glennrp ping_color_type, ping_bit_depth); 19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 19493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG compression_method: %d", 1950faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method); 19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG interlace_method: %d, filter_method: %d", 1953faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method,ping_filter_method); 19543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1956faa852bad40107edae19405e76a299057668d795glennrp#ifdef PNG_READ_iCCP_SUPPORTED 1957faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_iCCP)) 19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy info, 19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name; 19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile_length; 19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_iCCP(ping,ping_info,&name,(int *) &compression,&info, 19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &profile_length); 19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile_length != 0) 19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG iCCP chunk."); 19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=AcquireStringInfo(profile_length); 19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetStringInfoDatum(profile,(const unsigned char *) info); 19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageProfile(image,"icc",profile); 19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sRGB_SUPPORTED) 19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intent; 19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_global_srgb) 1992e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent=PNG_RenderingIntent_to_Magick_RenderingIntent( 1993e610a071534e448c46460a5aa39ede33bf56b329glennrp mng_info->global_srgb_intent); 19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_sRGB(ping,ping_info,&intent)) 19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1996e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent=PNG_RenderingIntent_to_Magick_RenderingIntent( 1997e610a071534e448c46460a5aa39ede33bf56b329glennrp intent); 19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2000e610a071534e448c46460a5aa39ede33bf56b329glennrp " Reading PNG sRGB chunk: rendering_intent: %d",intent); 20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy double 20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy file_gamma; 20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2008faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_gAMA(ping,ping_info,&file_gamma)) 2009faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_gama) 2010faa852bad40107edae19405e76a299057668d795glennrp png_set_gAMA(ping,ping_info,mng_info->global_gamma); 20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_gAMA(ping,ping_info,&file_gamma)) 20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gamma=(float) file_gamma; 20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG gAMA chunk: gamma: %f",file_gamma); 20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2019faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 2020faa852bad40107edae19405e76a299057668d795glennrp { 2021faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_chrm != MagickFalse) 2022faa852bad40107edae19405e76a299057668d795glennrp { 2023faa852bad40107edae19405e76a299057668d795glennrp (void) png_set_cHRM(ping,ping_info, 2024faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.x, 2025faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.y, 2026faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.x, 2027faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.y, 2028faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.x, 2029faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.y, 2030faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.x, 2031faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.y); 2032faa852bad40107edae19405e76a299057668d795glennrp } 2033faa852bad40107edae19405e76a299057668d795glennrp } 2034faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_cHRM(ping,ping_info, 20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.x, 20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.y, 20393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.x, 20403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.y, 20413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.x, 20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.y, 20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.x, 20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.y); 20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 20463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 20473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG cHRM chunk."); 20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2049e610a071534e448c46460a5aa39ede33bf56b329glennrp if (image->rendering_intent != UndefinedIntent) 20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2051e610a071534e448c46460a5aa39ede33bf56b329glennrp png_set_sRGB(ping,ping_info, 2052e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 2053e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent)); 2054faa852bad40107edae19405e76a299057668d795glennrp png_set_gAMA(ping,ping_info,0.45455f); 2055faa852bad40107edae19405e76a299057668d795glennrp png_set_cHRM(ping,ping_info, 2056faa852bad40107edae19405e76a299057668d795glennrp 0.6400f, 0.3300f, 0.3000f, 0.6000f, 2057faa852bad40107edae19405e76a299057668d795glennrp 0.1500f, 0.0600f, 0.3127f, 0.3290f); 20583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_oFFs_SUPPORTED) 2060faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 20613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=png_get_x_offset_pixels(ping, ping_info); 20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=png_get_y_offset_pixels(ping, ping_info); 20643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x || image->page.y) 20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2067e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG oFFs chunk: x: %.20g, y: %.20g.",(double) 2068e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->page.x,(double) image->page.y); 20693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 20703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 2072faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 2073faa852bad40107edae19405e76a299057668d795glennrp { 2074faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_phys) 2075faa852bad40107edae19405e76a299057668d795glennrp { 2076faa852bad40107edae19405e76a299057668d795glennrp png_set_pHYs(ping,ping_info, 2077faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_x_pixels_per_unit, 2078faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_y_pixels_per_unit, 2079faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_phys_unit_type); 2080faa852bad40107edae19405e76a299057668d795glennrp } 2081faa852bad40107edae19405e76a299057668d795glennrp } 2082faa852bad40107edae19405e76a299057668d795glennrp 2083faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unit_type; 20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_resolution, 20903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_resolution; 20913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 20933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image resolution. 20943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 20953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_pHYs(ping,ping_info,&x_resolution,&y_resolution, 20960881b52ab4fee8427578a694081946c4c4e92b35cristy &unit_type); 20970881b52ab4fee8427578a694081946c4c4e92b35cristy image->x_resolution=(double) x_resolution; 20980881b52ab4fee8427578a694081946c4c4e92b35cristy image->y_resolution=(double) y_resolution; 20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (unit_type == PNG_RESOLUTION_METER) 21003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 21023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->x_resolution=(double) x_resolution/100.0; 21033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->y_resolution=(double) y_resolution/100.0; 21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2107e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 2108e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) x_resolution,(double) y_resolution,unit_type); 21093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2111faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 21173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 21203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((number_colors == 0) && 2121faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) 21223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte_length) 21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_PLTE(ping,ping_info,mng_info->global_plte, 21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int) mng_info->global_plte_length); 2127faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_trns_length) 21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_trns_length > 21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length) 21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception, 21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 21343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "global tRNS has more entries than global PLTE", 21353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 21363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_tRNS(ping,ping_info,mng_info->global_trns, 21373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int) mng_info->global_trns_length,NULL); 21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_bKGD_SUPPORTED) 21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( 21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index || 21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2144faa852bad40107edae19405e76a299057668d795glennrp png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_16 21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background; 21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_saved_bkgd_index) 21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.index=mng_info->saved_bkgd_index; 21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2153faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping, ping_info, PNG_INFO_bKGD)) 2154faa852bad40107edae19405e76a299057668d795glennrp background.index=ping_background->index; 21553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.red=(png_uint_16) 21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].red; 21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.green=(png_uint_16) 21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].green; 21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.blue=(png_uint_16) 21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].blue; 21613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_bKGD(ping,ping_info,&background); 21623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"No global PLTE in file","`%s'", 21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_bKGD_SUPPORTED) 2173faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_bkgd && 2174faa852bad40107edae19405e76a299057668d795glennrp (!png_get_valid(ping,ping_info,PNG_INFO_bKGD))) 21753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_info->mng_global_bkgd; 2176faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 21773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image background color. 21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 21833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG bKGD chunk."); 21842cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (ping_bit_depth == MAGICKCORE_QUANTUM_DEPTH) 21853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2186faa852bad40107edae19405e76a299057668d795glennrp image->background_color.red=ping_background->red; 2187faa852bad40107edae19405e76a299057668d795glennrp image->background_color.green=ping_background->green; 2188faa852bad40107edae19405e76a299057668d795glennrp image->background_color.blue=ping_background->blue; 21893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21902cbb4489df0a2a31907769956f217d4b9d982bd0glennrp else /* Scale background components to 16-bit */ 21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21922cbb4489df0a2a31907769956f217d4b9d982bd0glennrp unsigned int 21932cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale; 21942cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 21952cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (logging != MagickFalse) 21962cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 21972cbb4489df0a2a31907769956f217d4b9d982bd0glennrp " raw ping_background=(%d,%d,%d).",ping_background->red, 21982cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->green,ping_background->blue); 21992cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 22002cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale = 1; 22012cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (ping_bit_depth == 1) 22022cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale = 255; 22032cbb4489df0a2a31907769956f217d4b9d982bd0glennrp else if (ping_bit_depth == 2) 22042cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale = 85; 22052cbb4489df0a2a31907769956f217d4b9d982bd0glennrp else if (ping_bit_depth == 4) 22062cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale = 17; 22072cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (ping_bit_depth <= 8) 22082cbb4489df0a2a31907769956f217d4b9d982bd0glennrp bkgd_scale *= 257; 22092cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 22102cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->red *= bkgd_scale; 22112cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->green *= bkgd_scale; 22122cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->blue *= bkgd_scale; 22132cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 22142cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (logging != MagickFalse) 22152cbb4489df0a2a31907769956f217d4b9d982bd0glennrp { 22162cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22172cbb4489df0a2a31907769956f217d4b9d982bd0glennrp " bkgd_scale=%d.",bkgd_scale); 22182cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22192cbb4489df0a2a31907769956f217d4b9d982bd0glennrp " ping_background=(%d,%d,%d).",ping_background->red, 22202cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->green,ping_background->blue); 22212cbb4489df0a2a31907769956f217d4b9d982bd0glennrp } 22222cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red= 2224faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->red); 22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green= 2226faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->green); 22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue= 2228faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->blue); 22292cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 22302cbb4489df0a2a31907769956f217d4b9d982bd0glennrp if (logging != MagickFalse) 22312cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2232e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->background_color=(%.20g,%.20g,%.20g).", 2233e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->background_color.red, 2234e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->background_color.green, 2235e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->background_color.blue); 22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.red=0; 22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.green=0; 22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.blue=0; 22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.opacity=0; 2243faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image has a transparent background. 22473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 22483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy max_sample; 22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 225135ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 225235ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 225335ef824baa82511126ff0072ae30eee0da9c05a3cristy 22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 22553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG tRNS chunk."); 22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2258f9cca6af1ff9b913c32a2cec81eda059877a8832cristy max_sample = (int) ((one << ping_bit_depth) - 1); 22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2260faa852bad40107edae19405e76a299057668d795glennrp if ((ping_color_type == PNG_COLOR_TYPE_GRAY && 2261faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->gray > max_sample) || 2262faa852bad40107edae19405e76a299057668d795glennrp (ping_color_type == PNG_COLOR_TYPE_RGB && 2263faa852bad40107edae19405e76a299057668d795glennrp ((int)ping_trans_color->red > max_sample || 2264faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->green > max_sample || 2265faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->blue > max_sample))) 22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Ignoring PNG tRNS chunk with out-of-range sample."); 22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free_data(ping, ping_info, PNG_FREE_TRNS, 0); 2271faa852bad40107edae19405e76a299057668d795glennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 227605eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.red= (unsigned short)(ping_trans_color->red); 227705eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.green= (unsigned short) (ping_trans_color->green); 227805eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.blue= (unsigned short) (ping_trans_color->blue); 227905eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.opacity= (unsigned short) (ping_trans_color->gray); 228005eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp 2281faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22830f111984738842d27d04aed2a3f823d82a943506glennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 22840f111984738842d27d04aed2a3f823d82a943506glennrp if (ping_bit_depth < MAGICKCORE_QUANTUM_DEPTH) 22850f111984738842d27d04aed2a3f823d82a943506glennrp#endif 228605eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.opacity=(unsigned short) ( 22870f111984738842d27d04aed2a3f823d82a943506glennrp ping_trans_color->gray * 228805eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp (65535L/((1UL << ping_bit_depth)-1))); 22890f111984738842d27d04aed2a3f823d82a943506glennrp 229005eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 229105eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp else 229205eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.opacity=(unsigned short) ( 229305eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp (ping_trans_color->gray * 65535L)/ 229405eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp ((1UL << ping_bit_depth)-1)); 22950f111984738842d27d04aed2a3f823d82a943506glennrp#endif 22960f111984738842d27d04aed2a3f823d82a943506glennrp if (logging != MagickFalse) 22970f111984738842d27d04aed2a3f823d82a943506glennrp { 22980f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22990f111984738842d27d04aed2a3f823d82a943506glennrp " Raw tRNS graylevel is %d.",ping_trans_color->gray); 23000f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23010f111984738842d27d04aed2a3f823d82a943506glennrp " scaled graylevel is %d.",transparent_color.opacity); 23020f111984738842d27d04aed2a3f823d82a943506glennrp } 23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.red=transparent_color.opacity; 23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.green=transparent_color.opacity; 23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent_color.blue=transparent_color.opacity; 23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sBIT_SUPPORTED) 23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_global_sbit) 23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2312faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_sBIT)) 23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sBIT(ping,ping_info,&mng_info->global_sbit); 23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 2317faa852bad40107edae19405e76a299057668d795glennrp 23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_update_info(ping,ping_info); 2319faa852bad40107edae19405e76a299057668d795glennrp 2320faa852bad40107edae19405e76a299057668d795glennrp ping_rowbytes=png_get_rowbytes(ping,ping_info); 2321faa852bad40107edae19405e76a299057668d795glennrp 23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image structure. 23243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.left=0; 2326bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.right=(ssize_t) ping_width; 23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.top=0; 2328bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.bottom=(ssize_t) ping_height; 23293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 23303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2331faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_width=ping_width; 2332faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_height=ping_height; 23333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame=mng_info->image_box; 23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_info->image_box; 23353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[mng_info->object_id]; 23393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->compression=ZipCompression; 2341faa852bad40107edae19405e76a299057668d795glennrp image->columns=ping_width; 2342faa852bad40107edae19405e76a299057668d795glennrp image->rows=ping_height; 2343faa852bad40107edae19405e76a299057668d795glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 2344faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 2345faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY)) 23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2347befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 2348befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 2349befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=PseudoClass; 2351befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 2352befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy image->colors=one << ping_bit_depth; 23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 8) 23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 256) 23553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=256; 23563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 65536L) 23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=65536L; 23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2360faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 23613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 23633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 23643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 23663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 23673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 2369bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->colors=(size_t) number_colors; 23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG PLTE chunk: number_colors: %d.",number_colors); 23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 23773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image colormap. 23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (AcquireImageColormap(image,image->colors) == MagickFalse) 23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 2383faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 23863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 23903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 2392bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleCharToQuantum(palette[i].red); 23953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleCharToQuantum(palette[i].green); 23963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleCharToQuantum(palette[i].blue); 23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2401bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scale; 24033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2404faa852bad40107edae19405e76a299057668d795glennrp scale=(QuantumRange/((1UL << ping_bit_depth)-1)); 24053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scale < 1) 24063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scale=1; 2407bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=(Quantum) (i*scale); 24103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=(Quantum) (i*scale); 24113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=(Quantum) (i*scale); 24123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image scanlines. 24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay != 0) 24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found++; 24200ca69b143ae83fb90449a01e0b0900cb83a1cbc8glennrp if ((mng_info->mng_type == 0 && (image->ping != MagickFalse)) || ( 2421347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->number_scenes != 0) && (mng_info->scenes_found > (ssize_t) 2422347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->first_scene+image_info->number_scenes)))) 24233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2426e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping PNG image data for scene %.20g",(double) 24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found-1); 24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 2430f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 24323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()."); 24353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 24363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG IDAT chunk(s)"); 24403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 24413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) AcquireQuantumMemory(image->rows, 2442faa852bad40107edae19405e76a299057668d795glennrp ping_rowbytes*sizeof(*png_pixels)); 24433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2444faa852bad40107edae19405e76a299057668d795glennrp png_pixels=(unsigned char *) AcquireQuantumMemory(ping_rowbytes, 24453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*png_pixels)); 24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_pixels == (unsigned char *) NULL) 24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Converting PNG pixels to pixel packets"); 24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PNG pixels to pixel packets. 24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2454faa852bad40107edae19405e76a299057668d795glennrp if (setjmp(png_jmpbuf(ping))) 24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG image is corrupt. 24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 2461f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info != (QuantumInfo *) NULL) 24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info = DestroyQuantumInfo(quantum_info); 24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_pixels != (unsigned char *) NULL) 24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) RelinquishMagickMemory(png_pixels); 24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() with error."); 24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 24717b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy { 24727b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy InheritException(exception,&image->exception); 24737b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy image->columns=0; 24747b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy } 24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 24763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2477ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy quantum_info=AcquireQuantumInfo(image_info,image); 2478ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy if (quantum_info == (QuantumInfo *) NULL) 2479ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 24803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 24843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert image to DirectClass pixel packets. 24853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 8) 24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth; 24893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2490bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy depth=(ssize_t) ping_bit_depth; 24913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2492faa852bad40107edae19405e76a299057668d795glennrp image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 2493faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 2494faa852bad40107edae19405e76a299057668d795glennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 2495faa852bad40107edae19405e76a299057668d795glennrp MagickTrue : MagickFalse; 24963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2497bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 24983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 2500faa852bad40107edae19405e76a299057668d795glennrp row_offset=ping_rowbytes*y; 25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset=0; 25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_row(ping,png_pixels+row_offset,NULL); 2504abc8f408bb48da2d73cb760d61f16063695081d2cristy q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 25063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 25073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (0 && (MAGICKCORE_QUANTUM_DEPTH == 8) && !defined(MAGICKCORE_HDRI_SUPPORT)) 25083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth == 16) 25093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register Quantum 25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p, 25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 25133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 25143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=png_pixels+row_offset; 25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=r; 2516faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2518bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 25193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 2522faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) && 25233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (((*(p-2) << 8)|*(p-1)) == transparent_color.opacity)) 25243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Cheap transparency */ 25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=TransparentOpacity; 25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=OpaqueOpacity; 25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2532faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_RGB) 25333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2534faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 2535bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((((*(p-6) << 8)|*(p-5)) == transparent_color.red) && 25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (((*(p-4) << 8)|*(p-3)) == transparent_color.green) && 25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (((*(p-2) << 8)|*(p-1)) == transparent_color.blue)) 25463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Cheap transparency */ 25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=TransparentOpacity; 25493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=OpaqueOpacity; 25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2554bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=OpaqueOpacity; 25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2565faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 2566bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (4*image->columns); x != 0; x--) 25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2571faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 2572bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (2*image->columns); x != 0; x--) 25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2578faa852bad40107edae19405e76a299057668d795glennrp if (depth == 8 && ping_color_type == PNG_COLOR_TYPE_GRAY) 25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 25803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GrayQuantum,png_pixels+row_offset); 2581faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY || 2582faa852bad40107edae19405e76a299057668d795glennrp ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 25833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GrayAlphaQuantum,png_pixels+row_offset); 25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2588faa852bad40107edae19405e76a299057668d795glennrp else if (depth == 8 && ping_color_type == PNG_COLOR_TYPE_RGB) 25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RGBQuantum,png_pixels+row_offset); 2591faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_RGB || 2592faa852bad40107edae19405e76a299057668d795glennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 25953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RGBAQuantum,png_pixels+row_offset); 25973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2598faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexQuantum,png_pixels+row_offset); 26013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else /* (MAGICKCORE_QUANTUM_DEPTH != 8) */ 2602faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY) 26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GrayQuantum,png_pixels+row_offset,exception); 2605faa852bad40107edae19405e76a299057668d795glennrp else if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GrayAlphaQuantum,png_pixels+row_offset,exception); 2608faa852bad40107edae19405e76a299057668d795glennrp else if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 26093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RGBAQuantum,png_pixels+row_offset,exception); 2611faa852bad40107edae19405e76a299057668d795glennrp else if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 26123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexQuantum,png_pixels+row_offset,exception); 26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 26153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 26163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RGBQuantum,png_pixels+row_offset,exception); 26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 26187a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes == 1)) 26197a287bfadeadea12e47c2376ca78a5d101687142cristy { 2620cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 2621cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy image->rows); 26227a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 26237a287bfadeadea12e47c2376ca78a5d101687142cristy break; 26247a287bfadeadea12e47c2376ca78a5d101687142cristy } 26253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 26263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 26273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26287a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes != 1)) 26293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 26313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 26323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 26333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* image->storage_class != DirectClass */ 26363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 26373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Quantum 26393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_scanline; 26403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 26413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register Quantum 26423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 26433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 26443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 26453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert grayscale image to PseudoClass pixel packets. 26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2647faa852bad40107edae19405e76a299057668d795glennrp image->matte=ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ? 26483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickTrue : MagickFalse; 26493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) AcquireQuantumMemory(image->columns, 26503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->matte ? 2 : 1)*sizeof(*quantum_scanline)); 26513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_scanline == (Quantum *) NULL) 26523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 2653bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 26543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 2656faa852bad40107edae19405e76a299057668d795glennrp row_offset=ping_rowbytes*y; 26573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 26583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset=0; 26593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_row(ping,png_pixels+row_offset,NULL); 26603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 26613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 26635c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes=GetAuthenticIndexQueue(image); 26643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=png_pixels+row_offset; 26653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 2666faa852bad40107edae19405e76a299057668d795glennrp switch (ping_bit_depth) 26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1: 26693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2670bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit; 26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2673bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-7; x > 0; x-=8) 26743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=7; bit >= 0; bit--) 26763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(Quantum) ((*p) & (0x01 << bit) ? 0x01 : 0x00); 26773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 8) != 0) 26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2681bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (bit=7; bit >= (ssize_t) (8-(image->columns % 8)); bit--) 26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(Quantum) ((*p) & (0x01 << bit) ? 0x01 : 0x00); 26833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 26853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 2: 26873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2688bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-3; x > 0; x-=4) 26893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p >> 6) & 0x03; 26913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p >> 4) & 0x03; 26923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p >> 2) & 0x03; 26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p++) & 0x03; 26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 4) != 0) 26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2697bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=3; i >= (ssize_t) (4-(image->columns % 4)); i--) 26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(Quantum) ((*p >> (i*2)) & 0x03); 26993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 4: 27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2704bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x > 0; x-=2) 27053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p >> 4) & 0x0f; 27073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p++) & 0x0f; 27083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 2) != 0) 27103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p++ >> 4) & 0x0f; 27113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 27143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2715faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 2716bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 27173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 27193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* In image.h, OpaqueOpacity is 0 27203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * TransparentOpacity is QuantumRange 27213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * In a PNG datastream, Opaque is QuantumRange 27223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and Transparent is 0. 27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 27243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=ScaleCharToQuantum((unsigned char) (255-(*p++))); 27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2728bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 27293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=*p++; 27303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2734bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 27353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 16) 2737bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 27383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 27393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 27403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 256) 27413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=((*p++) << 8); 27423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 27433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=0; 27443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum=(*r); 27453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum|=(*p++); 27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=(Quantum) quantum; 27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r++; 2748faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 27493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum=((*p++) << 8); 27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum|=(*p++); 27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) (QuantumRange-quantum); 27533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 32) 2757bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 27583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum; 27593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 27603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 256) 27613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=((*p++) << 8); 27623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 27633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=0; 27643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum=(*r); 27653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum|=(*p++); 27663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r=quantum; 27673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r++; 2768faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 27693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(*p << 8) | *(p+1); 27713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity*=65537L; 277246f08209f719f4adeea742c45873c2714e80cdb9cristy q->opacity=(Quantum) GetAlphaPixelComponent(q); 27733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=2; 27743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 27753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else /* MAGICKCORE_QUANTUM_DEPTH == 8 */ 27773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r++=(*p++); 27783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* strip low byte */ 2779faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 27803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) (QuantumRange-(*p++)); 27823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 27833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 27843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 27863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 27873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 27913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 27923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 27943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Transfer image scanline. 27953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 27963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 2797bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 279880ac8b9110f1adf7202ed1f4f244cbb1a4e1a56fcristy indexes[x]=(IndexPacket) (*r++); 27993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 28003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 28017a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes == 1)) 28027a287bfadeadea12e47c2376ca78a5d101687142cristy { 2803cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 2804cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy image->rows); 28057a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 28067a287bfadeadea12e47c2376ca78a5d101687142cristy break; 28077a287bfadeadea12e47c2376ca78a5d101687142cristy } 28083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28097a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes != 1)) 28103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 28123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 28133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 28143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); 28163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2817b32b90a7e1ee2275333589072c496b5f69e17feccristy if (quantum_info != (QuantumInfo *) NULL) 2818b32b90a7e1ee2275333589072c496b5f69e17feccristy quantum_info=DestroyQuantumInfo(quantum_info); 28195c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (image->storage_class == PseudoClass) 28205c6f789db7a30bad01ace12b09ad9cd471339e94cristy { 2821aeb2cbc4eb61cc6a04744db1dc52f5319c466e29cristy MagickBooleanType 28225c6f789db7a30bad01ace12b09ad9cd471339e94cristy matte; 28235c6f789db7a30bad01ace12b09ad9cd471339e94cristy 28245c6f789db7a30bad01ace12b09ad9cd471339e94cristy matte=image->matte; 28255c6f789db7a30bad01ace12b09ad9cd471339e94cristy image->matte=MagickFalse; 28265c6f789db7a30bad01ace12b09ad9cd471339e94cristy (void) SyncImage(image); 2827aeb2cbc4eb61cc6a04744db1dc52f5319c466e29cristy image->matte=matte; 28285c6f789db7a30bad01ace12b09ad9cd471339e94cristy } 28293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_end(ping,ping_info); 28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0 && mng_info->scenes_found-1 < 2832bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) image_info->first_scene && image->delay != 0) 28333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 28353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) RelinquishMagickMemory(png_pixels); 28363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 28373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 28383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 2839f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 28403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 28413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 28423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() early."); 28443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 28453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2846faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 28473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ClassType 28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class; 28503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 28523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image has a transparent background. 28533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 28543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class=image->storage_class; 28553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickTrue; 2856c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2857e805a647adebb9faefcbd7f9a73ca8e91870614acristy#if 1 /* balfour fix */ 2858c11cf6a442f3046940608a5743a68cc891deb13eglennrp/* From imagemagick discourse server, 5 Feb 2010 */ 2859c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2860c11cf6a442f3046940608a5743a68cc891deb13eglennrp if (storage_class == PseudoClass) 2861c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2862faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 2863c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2864faa852bad40107edae19405e76a299057668d795glennrp for (x=0; x < ping_num_trans; x++) 2865c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2866e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp image->colormap[x].opacity = 2867e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ScaleCharToQuantum((unsigned char)(255-ping_trans_alpha[x])); 2868c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2869c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2870faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY) 2871c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 28725af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp for (x=0; x < (int) image->colors; x++) 2873c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 287405eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp if (ScaleQuantumToShort(image->colormap[x].red) == 287505eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp transparent_color.opacity) 2876c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2877c11cf6a442f3046940608a5743a68cc891deb13eglennrp image->colormap[x].opacity = (Quantum) TransparentOpacity; 2878c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2879c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2880c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2881d027259799c88ed5e4f12d21a5366031bfef0904cristy (void) SyncImage(image); 2882c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2883c11cf6a442f3046940608a5743a68cc891deb13eglennrp else 2884c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2885c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2886bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 2887c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 2888c11cf6a442f3046940608a5743a68cc891deb13eglennrp image->storage_class=storage_class; 2889c11cf6a442f3046940608a5743a68cc891deb13eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 2890c11cf6a442f3046940608a5743a68cc891deb13eglennrp if (q == (PixelPacket *) NULL) 2891c11cf6a442f3046940608a5743a68cc891deb13eglennrp break; 28925c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes=GetAuthenticIndexQueue(image); 2893c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2894bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 2895c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 289605eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp if (ScaleQuantumToShort(q->red) == transparent_color.red && 289705eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp ScaleQuantumToShort(q->green) == transparent_color.green && 289805eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp ScaleQuantumToShort(q->blue) == transparent_color.blue) 2899c11cf6a442f3046940608a5743a68cc891deb13eglennrp q->opacity=(Quantum) TransparentOpacity; 2900c11cf6a442f3046940608a5743a68cc891deb13eglennrp else 2901c11cf6a442f3046940608a5743a68cc891deb13eglennrp SetOpacityPixelComponent(q,OpaqueOpacity); 2902c11cf6a442f3046940608a5743a68cc891deb13eglennrp q++; 2903c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2904c11cf6a442f3046940608a5743a68cc891deb13eglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 2905c11cf6a442f3046940608a5743a68cc891deb13eglennrp break; 2906c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2907c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 2908c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2909c11cf6a442f3046940608a5743a68cc891deb13eglennrp#else /* not balfour */ 2910c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2911c11cf6a442f3046940608a5743a68cc891deb13eglennrp 2912bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 29133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=storage_class; 29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 29163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q == (PixelPacket *) NULL) 29173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 29185c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes=GetAuthenticIndexQueue(image); 29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 29203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (storage_class == PseudoClass) 29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexPacket 29233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy indexpacket; 29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2925faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 2926bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 29273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29285c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexpacket=indexes[x]; 2929faa852bad40107edae19405e76a299057668d795glennrp if (indexpacket < ping_num_trans) 29303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=ScaleCharToQuantum((unsigned char) 2931bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (255-ping_trans_alpha[(ssize_t) indexpacket])); 29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2933ce70c17bb6433add2eb069515a4f3105989e0662cristy SetOpacityPixelComponent(q,OpaqueOpacity); 29343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 29353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2936faa852bad40107edae19405e76a299057668d795glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY) 2937bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 29383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29395c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexpacket=indexes[x]; 2940bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy q->red=image->colormap[(ssize_t) indexpacket].red; 29413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->green=q->red; 29423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->blue=q->red; 294305eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp if (ScaleQuantomToShort(q->red) == transparent_color.opacity) 29443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) TransparentOpacity; 29453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2946ce70c17bb6433add2eb069515a4f3105989e0662cristy SetOpacityPixelComponent(q,OpaqueOpacity); 29473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 29483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2951bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 29523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 295305eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp if (ScaleQuantumToShort(q->red) == transparent_color.red && 295405eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp ScaleQuantumToShort(q->green) == transparent_color.green && 295505eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp ScaleQuantumToShort(q->blue) == transparent_color.blue) 29563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) TransparentOpacity; 29573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2958ce70c17bb6433add2eb069515a4f3105989e0662cristy SetOpacityPixelComponent(q,OpaqueOpacity); 29593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 29603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 29623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 29633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2964c11cf6a442f3046940608a5743a68cc891deb13eglennrp#endif /* not balfour */ 29653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=DirectClass; 29663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2967b40fc46321caef77f32743c0dc22e9a4bcc88e71cristy if ((ping_color_type == PNG_COLOR_TYPE_GRAY) || 2968b40fc46321caef77f32743c0dc22e9a4bcc88e71cristy (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) 2969b40fc46321caef77f32743c0dc22e9a4bcc88e71cristy image->colorspace=GRAYColorspace; 29703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_text(ping,ping_info,&text,&num_text) != 0) 2971bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) num_text; i++) 29723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check for a profile */ 29743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 29753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 29773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG text chunk"); 29783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(text[i].key, "Raw profile type ",17) == 0) 29793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_read_raw_profile(image,image_info,text,(int) i); 29803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 29813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 29833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 29843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=text[i].text_length; 29863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=(char *) AcquireQuantumMemory(length+MaxTextExtent, 29873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*value)); 29883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value == (char *) NULL) 29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 29913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResourceLimitError,"MemoryAllocationFailed","`%s'", 29923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 29933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 29943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value='\0'; 29963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(value,text[i].text,length+2); 29973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageProperty(image,text[i].key,value); 29983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 30003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Keyword: %s",text[i].key); 30013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=DestroyString(value); 30023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 30053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Store the object if necessary. 30073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 30083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id && !mng_info->frozen[object_id]) 30093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 30113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy create a new object buffer. 30143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 30153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]=(MngBuffer *) 301690823213d62b0ba18557e61f1e6892c6fffd6cd4cristy AcquireAlignedMemory(1,sizeof(MngBuffer)); 30173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] != (MngBuffer *) NULL) 30183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=(Image *) NULL; 30203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->reference_count=1; 30213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->ob[object_id] == (MngBuffer *) NULL) || 30243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->frozen) 30253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 30273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResourceLimitError,"MemoryAllocationFailed","`%s'", 30293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 30303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->frozen) 30313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 30323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResourceLimitError,"Cannot overwrite frozen MNG object buffer", 30333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 30343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 30363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 30393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=DestroyImage 30403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->ob[object_id]->image); 30413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=CloneImage(image,0,0,MagickTrue, 30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 30433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 30443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image->file=(FILE *) NULL; 30453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 30463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 30473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResourceLimitError,"Cloning image for object buffer failed", 30483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 3049faa852bad40107edae19405e76a299057668d795glennrp if (ping_width > 250000L || ping_height > 250000L) 30503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping,"PNG Image dimensions are too large."); 3051faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->width=ping_width; 3052faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->height=ping_height; 3053faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->color_type=ping_color_type; 3054faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->sample_depth=ping_bit_depth; 3055faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->interlace_method=ping_interlace_method; 3056faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->compression_method= 3057faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method; 3058faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->filter_method=ping_filter_method; 3059faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 30603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 30623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 30633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 30653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte; 30663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy the PLTE to the object buffer. 30693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 30703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_get_PLTE(ping,ping_info,&plte,&number_colors); 30713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=number_colors; 30723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte[i]=plte[i]; 30753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 30783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=0; 30793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 30823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 30843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 30853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 30863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) RelinquishMagickMemory(png_pixels); 30883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 3089f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 30913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 30933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 30943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()"); 30953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 30963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* end of reading one PNG image */ 30983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 30993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 31013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 31023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 31033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 31043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 31053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 31073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 31083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 31113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 31143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 31163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure, 31173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging; 31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 31203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 31213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 31283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 31303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadPNGImage()"); 31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=AcquireImage(image_info); 31343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(FileOpenError,"UnableToOpenFile"); 31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify PNG signature. 31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,8,(unsigned char *) magic_number); 31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\211PNG\r\n\032\n",8) != 0) 31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 31443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 31463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 314890823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(MngInfo)); 31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 31503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 31513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 31533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 31563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 31583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 31593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 31613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 31623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (previous != (Image *) NULL) 31643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (previous->signature != MagickSignature) 31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 31673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 31693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error"); 31733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 31743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 31763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns == 0) || (image->rows == 0)) 31773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error."); 31813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 31823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"PNG8") == 0) 31843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageType(image,PaletteType); 31863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 31873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: Reduce to binary transparency */ 31893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"PNG24") == 0) 31923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageType(image,TrueColorType); 31943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 31953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"PNG32") == 0) 31973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageType(image,TrueColorMatteType); 31983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadPNGImage()"); 32003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 32013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 32023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 32063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 32073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e J N G I m a g e % 32123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 32153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 32163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOneJNGImage() reads a JPEG Network Graphics (JNG) image file 32183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 32193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 32203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 32213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 32233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOneJNGImage method is: 32253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOneJNGImage(MngInfo *mng_info, const ImageInfo *image_info, 32273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 32283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 32303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 32323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 32363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 32373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 32383ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneJNGImage(MngInfo *mng_info, 32393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 32403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 32413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 32423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image, 32433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image, 32443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 32453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jng_image; 32463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 32483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image_info, 32493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image_info; 32503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3251bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 32523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 32533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 32553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 32583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height, 32593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width; 32603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 32623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 32633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth, 32643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method, 32653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method, 32663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 32683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method, 32693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method; 32703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 32723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *s; 32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3274bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 32753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 32763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 32773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 32793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 32803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 32823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 32853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 32863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP, 32873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat, 32883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3290bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=0; 32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=0; 32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height=0; 32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width=0; 32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=(Image *) NULL; 32993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=(Image *) NULL; 33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) NULL; 33013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=(ImageInfo *) NULL; 33023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 33043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " enter ReadOneJNGImage()"); 33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 33073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 33083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 33103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 33113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 33123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 33143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " AcquireNextImage()"); 33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 33163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 33173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 33193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 33233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Signature bytes have already been read. 33243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 33253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickFalse; 33273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickFalse; 33283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 33293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (;;) 33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 33323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[MaxTextExtent]; 33333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 33353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 33363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 33393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 33413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new JNG chunk. 33423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 33443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 33453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 33463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 33473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 33483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(type,"errr",MaxTextExtent); 33493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 33503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(unsigned int) ReadBlob(image,4,(unsigned char *) type); 33513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 33533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3354e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading JNG chunk type %c%c%c%c, length: %.20g", 3355e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX || count == 0) 33583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 33593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 33603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 33613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 33623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 33643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 33653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 3366bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 33673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 33683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 33703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 33713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 33733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 33753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 33763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 33773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 33783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 33803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 16) 33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3383bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 33843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 3385bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 33863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 33873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=p[8]; 33883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth=p[9]; 33893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method=p[10]; 33903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method=p[11]; 33913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->interlace=jng_image_interlace_method != 0 ? PNGInterlace : 33923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NoInterlace; 33933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=p[12]; 33943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=p[13]; 33953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method=p[14]; 33963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method=p[15]; 33973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 33983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3400f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " jng_width: %16lu",(unsigned long) jng_width); 34013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3402f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " jng_width: %16lu",(unsigned long) jng_height); 34033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_color_type: %16d",jng_color_type); 34053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_sample_depth: %3d", 34073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth); 34083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_compression_method:%3d", 34103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method); 34113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_interlace_method: %3d", 34133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method); 34143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_sample_depth: %3d", 34163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth); 34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_compression_method:%3d", 34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method); 34203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_filter_method: %3d", 34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method); 34233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_interlace_method: %3d", 34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method); 34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 34293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 34303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 34313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((reading_idat == MagickFalse) && (read_JSEP == MagickFalse) && 34353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((memcmp(type,mng_JDAT,4) == 0) || (memcmp(type,mng_JdAA,4) == 0) || 34363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (memcmp(type,mng_IDAT,4) == 0) || (memcmp(type,mng_JDAA,4) == 0))) 34373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o create color_image 34403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o open color_blob, attached to color_image 34413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color type has alpha) 34423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy open alpha_blob, attached to alpha_image 34433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 34443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 344590823213d62b0ba18557e61f1e6892c6fffd6cd4cristy color_image_info=(ImageInfo *)AcquireAlignedMemory(1,sizeof(ImageInfo)); 34463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image_info == (ImageInfo *) NULL) 34473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(color_image_info); 34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=AcquireImage(color_image_info); 34503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image == (Image *) NULL) 34513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 34543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating color_blob."); 34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(color_image->filename); 34573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(color_image_info,color_image,WriteBinaryBlobMode, 34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 34603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping == MagickFalse) && (jng_color_type >= 12)) 34633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) 346590823213d62b0ba18557e61f1e6892c6fffd6cd4cristy AcquireAlignedMemory(1,sizeof(ImageInfo)); 34663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image_info == (ImageInfo *) NULL) 34673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(alpha_image_info); 34693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=AcquireImage(alpha_image_info); 34703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image == (Image *) NULL) 34713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 34733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 34743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 34753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 34773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating alpha_blob."); 34793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(alpha_image->filename); 34803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(alpha_image_info,alpha_image,WriteBinaryBlobMode, 34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 34823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 34853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 34873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[18]; 34883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 34903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing IHDR chunk to alpha_blob."); 34923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,8,(const unsigned char *) 34933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "\211PNG\r\n\032\n"); 34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,13L); 34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IHDR); 34963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_IHDR,13L); 34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+4,jng_width); 34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+8,jng_height); 34993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[12]=jng_alpha_sample_depth; 35003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[13]=0; /* color_type gray */ 35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[14]=0; /* compression method 0 */ 35023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[15]=0; /* filter_method 0 */ 35033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[16]=0; /* interlace_method 0 */ 35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,17,data); 35053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,17)); 35063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickTrue; 35093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JDAT,4) == 0) 35123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy chunk to color_image->blob 35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAT chunk data to color_blob."); 35203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(color_image,length,chunk); 35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 35233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 35253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IDAT,4) == 0) 35283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 35313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy IDAT header and chunk data to alpha_image->blob 35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 35373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 35393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying IDAT chunk data to alpha_blob."); 35413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3542bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(alpha_image,(size_t) length); 35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IDAT); 35443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_IDAT,length); 35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 35473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image, 35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(crc32(0,data,4),chunk,(uInt) length)); 35493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 35513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 35523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_JDAA,4) == 0) || (memcmp(type,mng_JdAA,4) == 0)) 35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy chunk data to alpha_image->blob 35593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 35623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 35643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 35653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAA chunk data to alpha_blob."); 35663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 35683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 35703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 35713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 35723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JSEP,4) == 0) 35753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickTrue; 35773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 35783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 35793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 35803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 35833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 2) 35853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 35873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=image->background_color.red; 35883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=image->background_color.red; 35893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 6) 35913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 35933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=ScaleCharToQuantum(p[3]); 35943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=ScaleCharToQuantum(p[5]); 35953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 35973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 35983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 36013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 36038182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->gamma=((float) mng_get_long(p))*0.00001; 36043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 36093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 36113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36128182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.x=0.00001*mng_get_long(p); 36138182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.y=0.00001*mng_get_long(&p[4]); 36148182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.x=0.00001*mng_get_long(&p[8]); 36158182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.y=0.00001*mng_get_long(&p[12]); 36168182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.x=0.00001*mng_get_long(&p[16]); 36178182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.y=0.00001*mng_get_long(&p[20]); 36188182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.x=0.00001*mng_get_long(&p[24]); 36198182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.y=0.00001*mng_get_long(&p[28]); 36203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 36263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 1) 36283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3629e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent= 3630e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_to_Magick_RenderingIntent(p[0]); 36313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gamma=0.45455f; 36323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x=0.6400f; 36333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y=0.3300f; 36343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x=0.3000f; 36353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y=0.6000f; 36363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x=0.1500f; 36373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y=0.0600f; 36383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x=0.3127f; 36393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.y=0.3290f; 36403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_oFFs,4) == 0) 36463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 36483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36498182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->page.x=mng_get_long(p); 36508182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->page.y=mng_get_long(&p[4]); 36513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] != 0) 36523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x/=10000; 36543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y/=10000; 36553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 36583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 36633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 36653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36668182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->x_resolution=(double) mng_get_long(p); 36678182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->y_resolution=(double) mng_get_long(&p[4]); 36683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] == PNG_RESOLUTION_METER) 36693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 36713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->x_resolution=image->x_resolution/100.0f; 36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->y_resolution=image->y_resolution/100.0f; 36733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0 36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do. */ 36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 36843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 36903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4)) 36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* IEND found */ 36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finish up reading image data: 37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o read main image from color_blob. 37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close color_blob. 37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color_type has alpha) 37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is PNG 37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadPNG 37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is JPEG 37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadJPEG 37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close alpha_blob. 37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o copy intensity of secondary image into 37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy opacity samples of main image. 37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o destroy the secondary image. 37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(color_image); 37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 37233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading jng_image from color_blob."); 37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(color_image_info->filename,MaxTextExtent,"%s", 37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image->filename); 37273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info->ping=MagickFalse; /* To do: avoid this */ 37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(color_image_info,exception); 37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(color_image->filename); 37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=DestroyImage(color_image); 37343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=DestroyImageInfo(color_image_info); 37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 37373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying jng_image pixels to main image."); 37423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=jng_height; 37433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=jng_width; 37443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns*sizeof(PixelPacket); 3745bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s=GetVirtualPixels(jng_image,0,y,image->columns,1,&image->exception); 37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(q,s,length); 37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 37543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type >= 12) 37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,0x00000000L); 37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IEND); 37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_IEND,0L); 37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,4)); 37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(alpha_image); 37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading opacity from alpha_blob."); 37723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(alpha_image_info->filename,MaxTextExtent, 37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",alpha_image->filename); 37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(alpha_image_info,exception); 37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 3778bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 37793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s=GetVirtualPixels(jng_image,0,y,image->columns,1, 37813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 37833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 3784bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns; x != 0; x--,q++,s++) 37853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) QuantumRange-s->red; 37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3787bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns; x != 0; x--,q++,s++) 37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=(Quantum) QuantumRange-s->red; 37903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (q->opacity != OpaqueOpacity) 37913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickTrue; 37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 37943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(alpha_image->filename); 37973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=DestroyImageInfo(alpha_image_info); 37993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 38003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 38053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read the JNG image. 38063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 38073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 38083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 38093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_width=jng_width; 38103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_height=jng_height; 38113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.width == 0 && image->page.height == 0) 38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=jng_width; 38153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=jng_height; 38163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x == 0 && image->page.y == 0) 38183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->x_off[mng_info->object_id]; 38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[mng_info->object_id]; 38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 38233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[mng_info->object_id]; 38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,2*TellBlob(image), 38283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 38303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOneJNGImage()"); 38323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d J N G I m a g e % 38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadJNGImage() reads a JPEG Network Graphics (JNG) image file 38473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (including the 8-byte signature) and returns it. It allocates the memory 38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 38493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 38503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 38523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadJNGImage method is: 38543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadJNGImage(const ImageInfo *image_info, ExceptionInfo 38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% *exception) 38573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 38593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 38613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 38633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 38653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadJNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 38673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 38743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 38803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 38823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure, 38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging; 38843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 38873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 38903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 38933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 38943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadJNGImage()"); 38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=AcquireImage(image_info); 38983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 39003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 39013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"JNG") != 0) 39033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 39043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify JNG signature. 39063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\213JNG\r\n\032\n",8) != 0) 39093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 39103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 39123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 391490823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(*mng_info)); 39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsImageObject(previous) != MagickFalse) 39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 39333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadJNGImage()"); 39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy page_geometry[MaxTextExtent]; 39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 39603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure; 39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object, 39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 39683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 39693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found, 39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3972bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile ssize_t 39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 39763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb, 39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb, 39873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb; 39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PixelPacket 39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color; 39923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3997bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4003bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level; 40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile short 40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop; 40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 40113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=0, 40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; /* 0: PNG or JNG; 1: MNG; 2: MNG-LC; 3: MNG-VLC */ 40193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4020bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout, 40223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout, 40233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 40243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_height, 40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_width, 40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 40273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 40283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 402938ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp /* These delays are all measured in image ticks_per_second, 403038ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp * not in MNG ticks_per_second 403138ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp */ 4032bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 40333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay, 40343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay, 40353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay, 40363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay, 40373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 40383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers, 40393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=1, 40413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0, 40423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_height=0, 40433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_width=0; 40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.top=0; 40463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.bottom=0; 40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.left=0; 40483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.right=0; 40493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.top=0; 40503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.bottom=0; 40513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.left=0; 40523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.right=0; 40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image_info->type=OptimizeType (new in version 5.4.0) to get the 40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy following optimizations: 40573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o 16-bit depth is reduced to 8 if all pixels contain samples whose 40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy high byte and low byte are identical. 40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o Opaque matte channel is removed. 40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o If matte channel is present but only one transparent color is 40623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy present, RGB+tRNS is written instead of RGBA 40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o Grayscale images are reduced to 1, 2, or 4 bit depth if 40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy this can be done without loss. 40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o Palette is sorted to remove unused entries and to put a 40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent color first, if PNG_SORT_PALETTE is also defined. 40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 40683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 40743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 40753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 40773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter ReadMNGImage()"); 40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=AcquireImage(image_info); 40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 408990823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(MngInfo)); 40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 40943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 16) 40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->optimize=image_info->type == OptimizeType; 41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify MNG signature. 41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\212MNG\r\n\032\n",8) != 0) 41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize some nonzero members of the MngInfo structure. 41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4118bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 4119bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[0]=MagickTrue; 41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickTrue; 41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; 41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickFalse; /* should be False when converting or mogrifying */ 41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=0; 41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=0; 41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1; 41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=0; 41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=MagickFalse; 41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color=image->background_color; 41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=mng_info->frame; 41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=mng_info->frame; 41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[MaxTextExtent]; 41493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new chunk. 41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(type,"errr",MaxTextExtent); 41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,4,(unsigned char *) type); 41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4165e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading MNG chunk type %c%c%c%c, length: %.20g", 4166e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX) 41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickFalse; 41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (count == 0) 41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 4179bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 41803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(JNG_SUPPORTED) 41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->jhdr_warning == 0) 41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"JNGCompressNotSupported","`%s'",image->filename); 41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->jhdr_warning++; 41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DHDR,4) == 0) 41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->dhdr_warning == 0) 41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DeltaPNGNotSupported","`%s'",image->filename); 42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->dhdr_warning++; 42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MEND,4) == 0) 42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4) == 0) 42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skip to IEND."); 42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MHDR,4) == 0) 42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4218bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 42193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 4220bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 42223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4225e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG width: %.20g",(double) mng_info->mng_width); 42263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4227e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG height: %.20g",(double) mng_info->mng_height); 42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=8; 42308182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->ticks_per_second=(size_t) mng_get_long(p); 42313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second == 0) 42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 42333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=1UL*image->ticks_per_second/ 42353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second; 42363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0; 42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 42393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=16; 42418182b0758e3429fb8dcd1700f09643fd4d80a41ccristy simplicity=(size_t) mng_get_long(p); 42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=1; /* Full MNG */ 42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 11) == 11)) 42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=2; /* LC */ 42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 9) == 9)) 42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=3; /* VLC */ 42483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type != 3) 42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickTrue; 42513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 42553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 42563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 42593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->mng_width > 65535L) || 42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height > 65535L)) 42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); 4267e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (void) FormatMagickString(page_geometry,MaxTextExtent, 4268e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "%.20gx%.20g+0+0",(double) mng_info->mng_width,(double) 4269f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->mng_height); 42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.left=0; 4271bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.right=(ssize_t) mng_info->mng_width; 42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.top=0; 4273bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.bottom=(ssize_t) mng_info->mng_height; 42743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=default_fb=previous_fb=mng_info->frame; 42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 42763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_info->frame; 42773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_TERM,4) == 0) 42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=0; 42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=p[0]; 42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (repeat == 3) 42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42918182b0758e3429fb8dcd1700f09643fd4d80a41ccristy final_delay=(png_uint_32) mng_get_long(&p[2]); 42928182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_iterations=(png_uint_32) mng_get_long(&p[6]); 42933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == PNG_UINT_31_MAX) 42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=0; 42953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickTrue; 42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " repeat=%d",repeat); 43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4303e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " final_delay=%.20g",(double) final_delay); 43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4305e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->iterations=%.20g",(double) image->iterations); 43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DEFI,4) == 0) 43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 43133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 43143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DEFI chunk found in MNG-VLC datastream","`%s'", 43153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=(p[0] << 8) | p[1]; 43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 2 && object_id != 0) 43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Nonzero object_id in MNG-LC datastream","`%s'", 43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id > MNG_MAX_OBJECTS) 43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Instead ofsuing a warning we should allocate a larger 43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo structure and continue. 43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"object id too large","`%s'",image->filename); 43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=MNG_MAX_OBJECTS; 43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[object_id]) 43323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->frozen[object_id]) 43333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception, 43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "DEFI cannot redefine a frozen MNG object","`%s'", 43383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 2) 43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[object_id]=p[2]; 43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object offset info. 43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4349bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->x_off[object_id]=(ssize_t) ((p[4] << 24) | (p[5] << 16) | 43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 4351bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->y_off[object_id]=(ssize_t) ((p[8] << 24) | (p[9] << 16) | 43523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[10] << 8) | p[11]); 43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4356e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " x_off[%d]: %.20g",object_id,(double) 4357f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->x_off[object_id]); 43583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4359e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " y_off[%d]: %.20g",object_id,(double) 4360f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->y_off[object_id]); 43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object clipping info. 43653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 27) 43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[object_id]=mng_read_box(mng_info->frame,0, 43683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &p[12]); 43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickFalse; 43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 5) 43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.red= 43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.green= 43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.blue= 43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickTrue; 43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BACK,4) == 0) 43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 43913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=p[6]; 43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mandatory_back && length > 5) 43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.red= 43983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.green= 44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 44013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.blue= 44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.opacity=OpaqueOpacity; 44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=(p[7] << 8) | p[8]; 44083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 44103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PLTE,4) == 0) 44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global PLTE. 44173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 44183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length && (length < 769)) 44193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte == (png_colorp) NULL) 44213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) AcquireQuantumMemory(256, 44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*mng_info->global_plte)); 4423bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) (length/3); i++) 44243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=p[3*i]; 44263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=p[3*i+1]; 44273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=p[3*i+2]; 44283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 442935ef824baa82511126ff0072ae30eee0da9c05a3cristy mng_info->global_plte_length=(unsigned int) (length/3); 44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=i; 44353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=i; 44363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=i; 44373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=256; 44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=0; 44433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_tRNS,4) == 0) 44473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* read global tRNS */ 44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 257) 4451bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 44523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=p[i]; 44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 44553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 44563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=255; 44573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 445812560f31d66b4ef4afdcff2c20807c555dcf2f7dcristy mng_info->global_trns_length=(unsigned int) length; 44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 44653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4466bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 44673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy igamma; 44683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44698182b0758e3429fb8dcd1700f09643fd4d80a41ccristy igamma=mng_get_long(p); 44703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_gamma=((float) igamma)*0.00001; 44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickTrue; 44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickFalse; 44753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 44803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global cHRM 44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 44853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44868182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.x=0.00001*mng_get_long(p); 44878182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.y=0.00001*mng_get_long(&p[4]); 44888182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.red_primary.x=0.00001*mng_get_long(&p[8]); 44893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.red_primary.y=0.00001* 44908182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[12]); 44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.x=0.00001* 44928182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[16]); 44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.y=0.00001* 44948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[20]); 44953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.x=0.00001* 44968182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[24]); 44973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.y=0.00001* 44988182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[28]); 44993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickTrue; 45003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickFalse; 45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 45073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 45093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global sRGB. 45103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 45113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4513e610a071534e448c46460a5aa39ede33bf56b329glennrp mng_info->global_srgb_intent= 4514e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_to_Magick_RenderingIntent(p[0]); 45153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickTrue; 45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickFalse; 45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 45233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do. */ 45253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 45273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global iCCP. 45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_FRAM,4) == 0) 45343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 45363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"FRAM chunk found in MNG-VLC datastream","`%s'", 45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->framing_mode == 2) || (mng_info->framing_mode == 4)) 45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout=default_frame_timeout; 45433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=default_fb; 45443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p[0]) 45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=p[0]; 45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Framing_mode=%d",mng_info->framing_mode); 45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note the delay and frame clipping boundaries. 45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 45553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* framing mode */ 4556bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy while (*p && ((p-chunk) < (ssize_t) length)) 45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name */ 45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name terminator */ 4559bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((p-chunk) < (ssize_t) (length-4)) 45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay, 45633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout, 45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping; 45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay=(*p++); 45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout=(*p++); 45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping=(*p++); 45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* change_sync */ 45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay) 45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45728182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay=1UL*image->ticks_per_second* 45738182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(p); 45748182b0758e3429fb8dcd1700f09643fd4d80a41ccristy if (mng_info->ticks_per_second != 0) 45758182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay/=mng_info->ticks_per_second; 4576bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 4577bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_delay=PNG_UINT_31_MAX; 45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=frame_delay; 45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4583e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_delay=%.20g",(double) frame_delay); 45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_timeout) 45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4587bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=1UL*image->ticks_per_second* 4588bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp mng_get_long(p); 4589bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp if (mng_info->ticks_per_second != 0) 4590bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout/=mng_info->ticks_per_second; 4591bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 4592bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=PNG_UINT_31_MAX; 45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=frame_timeout; 45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4598e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_timeout=%.20g",(double) frame_timeout); 45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping) 46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=mng_read_box(previous_fb,(char) p[0],&p[1]); 46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=17; 46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=fb; 46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4607e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Frame_clipping: L=%.20g R=%.20g T=%.20g B=%.20g", 4608e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.left,(double) fb.right,(double) fb.top, 4609e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.bottom); 46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping == 2) 46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=fb; 46123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=fb; 46163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_minimum_box(fb,mng_info->frame); 4617bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_width=(size_t) (mng_info->clip.right 46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.left); 4619bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_height=(size_t) (mng_info->clip.bottom 46203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.top); 46213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 46223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the frame if framing_mode is 4. 46233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 46243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 46253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4627e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " subframe_width=%.20g, subframe_height=%.20g",(double) 4628e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy subframe_width,(double) subframe_height); 46293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 4) && 46303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height)) 46313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 46343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 46483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 46523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 46563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 46573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 46583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 46603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 46613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 46623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 46633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 46643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4667e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 4668e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 4669e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 46703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 46723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 46733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 46743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLIP,4) == 0) 46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read CLIP. 46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object=(p[0] << 8) | p[1]; 46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object=(p[2] << 8) | p[3]; 46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=(int) first_object; i <= (int) last_object; i++) 46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i] && !mng_info->frozen[i]) 46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box=mng_info->object_clip[i]; 46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_read_box(box,(char) p[4],&p[5]); 46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 46983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SAVE,4) == 0) 47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 47033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i]) 47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickTrue; 47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 47073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->frozen=MagickTrue; 47093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 47133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_DISC,4) == 0) || (memcmp(type,mng_SEEK,4) == 0)) 47173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 47193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read DISC or SEEK. 47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 47213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((length == 0) || !memcmp(type,mng_SEEK,4)) 47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4728bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 47303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4731bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (j=0; j < (ssize_t) length; j+=2) 47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i=p[j] << 8 | p[j+1]; 47343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 47393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 47403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MOVE,4) == 0) 47423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4743bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 47463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read MOVE 47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object=(p[0] << 8) | p[1]; 47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object=(p[2] << 8) | p[3]; 4752bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=(ssize_t) first_object; i <= (ssize_t) last_object; i++) 47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i] && !mng_info->frozen[i]) 47553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 47573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_pair; 47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair; 47613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair.a=mng_info->x_off[i]; 47633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair.b=mng_info->y_off[i]; 47643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_pair=mng_read_pair(old_pair,(int) p[4],&p[5]); 47653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->x_off[i]=new_pair.a; 47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->y_off[i]=new_pair.b; 47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_LOOP,4) == 0) 47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4775bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t loop_iters=1; 47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=chunk[0]; 47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=1; /* mark loop active */ 47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Record starting point. 47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 47818182b0758e3429fb8dcd1700f09643fd4d80a41ccristy loop_iters=mng_get_long(&chunk[1]); 47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4784e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " LOOP level %.20g has %.20g iterations ",(double) loop_level, 4785e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) loop_iters); 47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (loop_iters == 0) 47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=loop_level; 47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 47893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_jump[loop_level]=TellBlob(image); 47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_count[loop_level]=loop_iters; 47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_iteration[loop_level]=0; 47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_ENDL,4) == 0) 47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=chunk[0]; 48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skipping_loop > 0) 48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skipping_loop == loop_level) 48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Found end of zero-iteration loop. 48063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=0; 48093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_active[loop_level] == 1) 48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_count[loop_level]--; 48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_iteration[loop_level]++; 48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4819e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " ENDL: LOOP level %.20g has %.20g remaining iterations ", 4820e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) loop_level,(double) 4821f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->loop_count[loop_level]); 48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_count[loop_level] != 0) 48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset=SeekBlob(image,mng_info->loop_jump[loop_level], 48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SEEK_SET); 48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, 48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "ImproperImageHeader"); 48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy short 48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level; 48343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finished loop. 48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=0; 48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level=(-1); 48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < loop_level; i++) 48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_active[i] == 1) 48423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level=(short) i; 48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=last_level; 48443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLON,4) == 0) 48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->clon_warning == 0) 48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"CLON is not implemented yet","`%s'", 48553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clon_warning++; 48573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MAGN,4) == 0) 48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 48623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 48643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 48653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 48673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 48683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 48703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 1) 48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=(p[0] << 8) | p[1]; 48743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=0; 48763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 3) 48773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=(p[2] << 8) | p[3]; 48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=magn_first; 48803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef MNG_OBJECT_BUFFERS 48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first || magn_last) 48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 48833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception, 48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MAGN is not implemented yet for nonzero objects", 48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 4) 48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=p[4]; 48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=0; 48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=(p[5] << 8) | p[6]; 48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 48993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mx == 0) 49013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=(p[7] << 8) | p[8]; 49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=magn_mx; 49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_my == 0) 49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=1; 49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 10) 49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=(p[9] << 8) | p[10]; 49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=magn_mx; 49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_ml == 0) 49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=1; 49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 12) 49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=(p[11] << 8) | p[12]; 49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=magn_mx; 49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mr == 0) 49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=1; 49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 14) 49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=(p[13] << 8) | p[14]; 49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=magn_my; 49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mt == 0) 49293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=1; 49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=(p[15] << 8) | p[16]; 49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=magn_my; 49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mb == 0) 49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=1; 49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=p[17]; 49403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=magn_methx; 49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx > 5 || magn_methy > 5) 49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception, 49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Unknown MAGN method in MNG datastream","`%s'", 49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Magnify existing objects in the range magn_first to magn_last */ 49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first == 0 || magn_last == 0) 49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Save the magnification factors for object 0 */ 49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mb=magn_mb; 49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_ml=magn_ml; 49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mr=magn_mr; 49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mt=magn_mt; 49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mx=magn_mx; 49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_my=magn_my; 49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methx=magn_methx; 49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methy=magn_methy; 49663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PAST,4) == 0) 49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->past_warning == 0) 49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"PAST is not implemented yet","`%s'", 49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->past_warning++; 49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SHOW,4) == 0) 49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->show_warning == 0) 49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"SHOW is not implemented yet","`%s'", 49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 49823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->show_warning++; 49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sBIT,4) == 0) 49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 4) 49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickFalse; 49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.gray=p[0]; 49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.red=p[0]; 49923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.green=p[1]; 49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.blue=p[2]; 49943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.alpha=p[3]; 49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickTrue; 49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 49993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_x_pixels_per_unit= 50038182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(p); 50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_y_pixels_per_unit= 50058182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(&p[4]); 50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_phys_unit_type=p[8]; 50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickTrue; 50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickFalse; 50113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYg,4) == 0) 50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->phyg_warning == 0) 50153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 50163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"pHYg is not implemented.","`%s'",image->filename); 50173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->phyg_warning++; 50183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BASI,4) == 0) 50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->basi_warning == 0) 50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 50243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"BASI is not implemented yet","`%s'", 50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 50263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->basi_warning++; 50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 5028bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 50293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 5030bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 50313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 50323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type=p[8]; 50333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method=p[9]; 50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type=p[10]; 50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method=p[11]; 50363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=(p[12] << 8) & p[13]; 50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=0; 50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 13) 50413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=(p[14] << 8) & p[15]; 50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=0; 50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 15) 50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=(p[16] << 8) & p[17]; 50463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=0; 50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=(p[18] << 8) & p[19]; 50503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (basi_sample_depth == 16) 50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=65535L; 50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=255; 50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 19) 50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=p[20]; 50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=0; 50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) 50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy && memcmp(type,mng_JHDR,4) 50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ) 50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Not an IHDR or JHDR chunk */ 50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Process IHDR */ 50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing %c%c%c%c chunk",type[0],type[1],type[2],type[3]); 50803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[object_id]=MagickTrue; 50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->invisible[object_id]) 50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skipping invisible object"); 50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 50883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 50948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_width=(size_t) mng_get_long(p); 50958182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_height=(size_t) mng_get_long(&p[4]); 50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a transparent background layer behind the entire animation 51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if it is not full screen. 51023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && mng_type && first_mng_object) 51053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->clip.left > 0) || (mng_info->clip.top > 0) || 51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_width < mng_info->mng_width) || 5108bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.right < (ssize_t) mng_info->mng_width) || 51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_height < mng_info->mng_height) || 5110bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.bottom < (ssize_t) mng_info->mng_height)) 51113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 51183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 51223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 51313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Make a background rectangle. 51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 51433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 51443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 51463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5149e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted transparent background layer, W=%.20g, H=%.20g", 5150e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->mng_width,(double) mng_info->mng_height); 51513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the upcoming image if 51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode is 3, and we haven't already inserted one. 51563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 3) && 51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height) && (simplicity == 0 || 51593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (simplicity & 0x08))) 51603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 51623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 51703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 51723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 51743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 51763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 51793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 51893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 51913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 51923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5196e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 5197e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 5198e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 51993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MNG_INSERT_LAYERS */ 52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 52023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 52033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 52053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 52073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 52093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 52203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 52213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 52223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 52243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->framing_mode == 1 || mng_info->framing_mode == 3) 52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->x_off[object_id]; 52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[object_id]; 52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 52413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Seek back to the beginning of the IHDR or JHDR chunk's length field. 52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 52433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 52453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Seeking back to beginning of %c%c%c%c chunk",type[0],type[1], 52463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[2],type[3]); 5247bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy offset=SeekBlob(image,-((ssize_t) length+12),SEEK_CUR); 52483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 52493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 52533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_type=mng_type; 52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_id=object_id; 52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) == 0) 52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 52623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsImageObject(previous) != MagickFalse) 52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 52753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 52773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 52803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type) 52843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box; 52873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx || mng_info->magn_methy) 52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height, 52923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width; 52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing MNG MAGN chunk"); 52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx == 1) 52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width=mng_info->magn_ml; 53013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr; 53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 53044e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width += (png_uint_32) ((image->columns-2)*(mng_info->magn_mx)); 53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53084e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width=(png_uint_32) image->columns; 53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_ml-1; 53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 53123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr-1; 53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 3) 53144e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width += (png_uint_32) ((image->columns-3)*(mng_info->magn_mx-1)); 53153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methy == 1) 53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height=mng_info->magn_mt; 53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb; 53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 53224d368204aa5ac1b8716da0054988319952030438cristy magnified_height += (png_uint_32) ((image->rows-2)*(mng_info->magn_my)); 53233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 53253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53264e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_height=(png_uint_32) image->rows; 53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 53283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mt-1; 53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 53303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb-1; 53313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 3) 53324e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_height += (png_uint_32) ((image->rows-3)*(mng_info->magn_my-1)); 53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magnified_height > image->rows || 53353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width > image->columns) 53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *large_image; 53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy; 53423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5343bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m, 53453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5347bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 53483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 53493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *n, 53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PixelPacket 53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next, 53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *prev; 53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 53673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocate magnified image"); 53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 53703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 53723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 53733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image=SyncNextImageInList(image); 53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->columns=magnified_width; 53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->rows=magnified_height; 53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=mng_info->magn_methx; 53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=mng_info->magn_methy; 53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 32) 53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM unsigned short 53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Scale pixels to unsigned shorts to prevent 53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy overflow of intermediate values of interpolations 53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5392bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 53933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1, 53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 5396bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->red=ScaleQuantumToShort(q->red); 53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->green=ScaleQuantumToShort(q->green); 54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->blue=ScaleQuantumToShort(q->blue); 54013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=ScaleQuantumToShort(q->opacity); 54023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM Quantum 54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(large_image); 54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->background_color.opacity=OpaqueOpacity; 54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(large_image); 54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=2; 54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=3; 54223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=2; 54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 54253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=3; 54263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the rows into the right side of the large image */ 54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5432e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the rows to %.20g",(double) large_image->rows); 5433bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy=0; 54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=(size_t) image->columns; 54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=(PixelPacket *) AcquireQuantumMemory(length,sizeof(*next)); 54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=(PixelPacket *) AcquireQuantumMemory(length,sizeof(*prev)); 54383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((prev == (PixelPacket *) NULL) || 54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next == (PixelPacket *) NULL)) 54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 54453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,0,image->columns,1,exception); 54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 5448bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (y == 0) 5451bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 5452bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-2) 5453bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 5454bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy <= 1 && y == (ssize_t) image->rows-1) 5455bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 5456bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-1) 54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 5459bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_my; 54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=prev; 54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=next; 54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=n; 5463bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (y < (ssize_t) image->rows-1) 54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,y+1,image->columns,1, 54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++, yy++) 54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5474bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(yy < (ssize_t) large_image->rows); 54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=prev; 54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=next; 54773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(large_image,0,yy,large_image->columns, 54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1,exception); 54793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q+=(large_image->columns-image->columns); 5480bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 54813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54825c6f789db7a30bad01ace12b09ad9cd471339e94cristy /* TO DO: get color as function of indexes[x] */ 54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy <= 1) 54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); /* replicate previous */ 54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methy == 2 || magn_methy == 4) 54943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); 54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 5500bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (*q).red=(QM) (((ssize_t) (2*i*((*n).red 5501bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).red)+m))/((ssize_t) (m*2)) 55023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).red); 5503bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (*q).green=(QM) (((ssize_t) (2*i*((*n).green 5504bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).green)+m))/((ssize_t) (m*2)) 55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).green); 5506bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (*q).blue=(QM) (((ssize_t) (2*i*((*n).blue 5507bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).blue)+m))/((ssize_t) (m*2)) 55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).blue); 55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 5510bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (*q).opacity=(QM) (((ssize_t) 55113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (2*i*((*n).opacity 55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -(*pixels).opacity)+m)) 5513bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy /((ssize_t) (m*2))+(*pixels).opacity); 55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 55193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(*pixels).opacity+0; 55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(*n).opacity+0; 55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methy == 3 || magn_methy == 5) */ 55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); 55293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*n); 55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5533bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (*q).opacity=(QM) (((ssize_t) (2*i*((*n).opacity 5534bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).opacity)+m))/((ssize_t) (m*2)) 55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).opacity); 55363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n++; 55393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels++; 55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* x */ 55423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(large_image,exception) == 0) 55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* i */ 55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* y */ 55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=(PixelPacket *) RelinquishMagickMemory(prev); 55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=(PixelPacket *) RelinquishMagickMemory(next); 55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns; 55503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Delete original image"); 55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DeleteImageFromList(&image); 55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=large_image; 55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 55603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the columns */ 55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5564e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the columns to %.20g",(double) image->columns); 55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5566bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register PixelPacket 55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 55703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=q+(image->columns-length); 55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=pixels+1; 5574bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (image->columns-length); 5575bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy x < (ssize_t) image->columns; x++) 55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5577bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (x == (ssize_t) (image->columns-length)) 5578bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_ml; 5579bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-2) 5580bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 5581bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx <= 1 && x == (ssize_t) image->columns-1) 5582bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 5583bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-1) 55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 5586bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mx; 55873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++) 55883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx <= 1) 55903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* replicate previous */ 55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); 55933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methx == 2 || magn_methx == 4) 55953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 55973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); 55983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 56013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).red=(QM) ((2*i*((*n).red 56023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -(*pixels).red)+m) 5603bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy /((ssize_t) (m*2))+(*pixels).red); 56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).green=(QM) ((2*i*((*n).green 56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -(*pixels).green) 5606bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy +m)/((ssize_t) (m*2))+(*pixels).green); 56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).blue=(QM) ((2*i*((*n).blue 56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -(*pixels).blue)+m) 5609bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy /((ssize_t) (m*2))+(*pixels).blue); 56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 56113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(QM) ((2*i*((*n).opacity 5612bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).opacity)+m)/((ssize_t) (m*2)) 56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).opacity); 56143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 56163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 56183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(*pixels).opacity+0; 56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(*n).opacity+0; 56223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methx == 3 || magn_methx == 5) */ 56253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 56273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 56283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*pixels); 56293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q=(*n); 56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*q).opacity=(QM) ((2*i*((*n).opacity 5635bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy -(*pixels).opacity)+m) /((ssize_t) (m*2)) 56363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +(*pixels).opacity); 56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 56403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n++; 56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 32) 56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 56493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Rescale pixels to Quantum 56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5653bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 5656bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->red=ScaleShortToQuantum(q->red); 56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->green=ScaleShortToQuantum(q->green); 56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->blue=ScaleShortToQuantum(q->blue); 56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q->opacity=ScaleShortToQuantum(q->opacity); 56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q++; 56633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished MAGN processing"); 56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_box is with respect to the upper left corner of the MNG. 56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.left=mng_info->image_box.left+mng_info->x_off[object_id]; 56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.right=mng_info->image_box.right+mng_info->x_off[object_id]; 56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.top=mng_info->image_box.top+mng_info->y_off[object_id]; 56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.bottom=mng_info->image_box.bottom+mng_info->y_off[object_id]; 56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->clip); 56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->frame); 56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->object_clip[object_id]); 56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left != (mng_info->image_box.left 56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.right != (mng_info->image_box.right 56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top != (mng_info->image_box.top 56903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id])) || 56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.bottom != (mng_info->image_box.bottom 56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id]))) 56933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Crop the PNG image"); 56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left < crop_box.right) && 56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top < crop_box.bottom)) 56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *im; 57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info; 57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 57073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_info is with respect to the upper left corner of 57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the image. 57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.x=(crop_box.left-mng_info->x_off[object_id]); 57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.y=(crop_box.top-mng_info->y_off[object_id]); 5712bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.width=(size_t) (crop_box.right-crop_box.left); 5713bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.height=(size_t) (crop_box.bottom-crop_box.top); 57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 57153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=CropImage(image,&crop_info,exception); 57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (im != (Image *) NULL) 57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=im->columns; 57223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=im->rows; 57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=DestroyImage(im); 57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 57253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 57263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=crop_box.left; 57273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=crop_box.top; 57283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy No pixels in crop area. The MNG spec still requires 57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a layer, though, so make a single transparent pixel in 57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the top left corner. 57363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=1; 57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=1; 57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 57403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=1; 57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=1; 57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 57493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 16) /* TO DO: treat Q:32 */ 57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Determine if bit depth can be reduced from 16 to 8. 57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * Note that the method GetImageDepth doesn't check background 57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and doesn't handle PseudoClass specially. Also it uses 57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * multiplication and division by 257 instead of shifting, so 57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * might be slower. 57583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->optimize && image->depth == 16) 57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ok_to_reduce; 57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const PixelPacket 57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5767bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ok_to_reduce=(((((size_t) image->background_color.red >> 8) & 57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0xff) 5769bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->background_color.red & 0xff)) && 5770bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) image->background_color.green >> 8) & 0xff) 5771bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->background_color.green & 0xff)) && 5772bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) image->background_color.blue >> 8) & 0xff) 5773bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->background_color.blue & 0xff))); 57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ok_to_reduce && image->storage_class == PseudoClass) 57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int indx; 57773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5778bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (indx=0; indx < (ssize_t) image->colors; indx++) 57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5780bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ok_to_reduce=(((((size_t) image->colormap[indx].red >> 57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8) & 0xff) 5782bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->colormap[indx].red & 0xff)) && 5783bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) image->colormap[indx].green >> 8) & 0xff) 5784bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->colormap[indx].green & 0xff)) && 5785bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) image->colormap[indx].blue >> 8) & 0xff) 5786bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy == ((size_t) image->colormap[indx].blue & 0xff))); 57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ok_to_reduce == MagickFalse) 57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 57893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((ok_to_reduce != MagickFalse) && 57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class != PseudoClass)) 57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5794bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 57953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5797bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 57983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5800bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 58033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 58043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 5805bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 58063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ok_to_reduce=(( 5808bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (((size_t) p->red >> 8) & 0xff) == 5809bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((size_t) p->red & 0xff)) && 5810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) p->green >> 8) & 0xff) == 5811bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((size_t) p->green & 0xff)) && 5812bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((((size_t) p->blue >> 8) & 0xff) == 5813bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((size_t) p->blue & 0xff)) && 58143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (((!image->matte || 5815bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (((size_t) p->opacity >> 8) & 0xff) == 5816bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ((size_t) p->opacity & 0xff))))); 58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ok_to_reduce == 0) 58183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x != 0) 58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 58233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ok_to_reduce) 58263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=8; 58283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reducing PNG bit depth to 8 without loss of info"); 58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageException(image,exception); 58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 58363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->scenes_found > 5838bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) (image_info->first_scene+image_info->number_scenes)) 58393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 58403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 58433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading image datastream."); 58443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (LocaleCompare(image_info->magick,"MNG") == 0); 58453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 58463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 58483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading all image datastreams."); 58493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 58503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && !mng_info->image_found && (mng_info->mng_width) && 58513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height)) 58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 58543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer if nothing else was found. 58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 58563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 58583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No images found. Inserting a background layer."); 58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetAuthenticPixelQueue(image) != (PixelPacket *) NULL) 58603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 58643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy AcquireNextImage(image_info,image); 58653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 58663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 58693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 58713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocation failed, returning NULL."); 58723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 58733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 58753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 58773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 58783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 58793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 58803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 58813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 58823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 58833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 58843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 58853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageBackgroundColor(image); 58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 58873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 58893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 58903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == 1) 58913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 58923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 58933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 58953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count > 10*mng_info->image_found) 58963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 58983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," No beginning"); 58993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 59003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted, beginning of list not found", 59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 59023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 59033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 59053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 59063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Corrupt list"); 59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 59103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted; next_image is NULL","`%s'", 59113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 59123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second && mng_info->image_found > 1 && 59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetNextImageInList(image) == 59163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (Image *) NULL) 59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 59203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " First image null"); 59213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"image->next for first image is NULL but shouldn't be.", 59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->image_found == 0) 59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 59293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No visible images found."); 59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 59313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"No visible images in file","`%s'",image_info->filename); 59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 59363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second) 59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1UL*MagickMax(image->ticks_per_second,1L)* 59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/mng_info->ticks_per_second; 59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Find final nonzero image delay */ 59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=0; 59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay) 59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=image->delay; 59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay < final_image_delay) 59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=final_image_delay; 59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=final_delay; 59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5956e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->delay=%.20g, final_delay=%.20g",(double) image->delay, 5957e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) final_delay); 59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 59663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Before coalesce:"); 59673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5968e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g",(double) image->delay); 59693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 59703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 59723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5973e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g",(double) scene++,(double) image->delay); 59743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_COALESCE_LAYERS 59793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers) 59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image, 59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next; 59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5985bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Coalesce Images"); 59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=image->scene; 59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=CoalesceImages(image,&image->exception); 59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 59933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 59943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next=image; next != (Image *) NULL; next=next_image) 59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.width=mng_info->mng_width; 59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.height=mng_info->mng_height; 60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.x=0; 60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.y=0; 60023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->scene=scene++; 60033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next); 60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->delay == 0) 60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->previous=GetPreviousImageInList(next); 60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetPreviousImageInList(next) == (Image *) NULL) 60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 60123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->previous->next=next_image; 60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=DestroyImage(next); 60153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 60213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->dispose=BackgroundDispose; 60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 60303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " After coalesce:"); 60333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6034e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g dispose=%.20g",(double) image->delay, 6035e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->dispose); 60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 6037f2faecf9facdbbb14fcba373365f9f691a9658e0cristy { 6038f2faecf9facdbbb14fcba373365f9f691a9658e0cristy image=GetNextImageInList(image); 6039f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6040e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g dispose=%.20g",(double) scene++, 6041e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay,(double) image->dispose); 6042f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 6043f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()"); 60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 605125c1e2baba76d9cf3ec582f217f96af95259e747glennrp#else /* PNG_LIBPNG_VER > 10011 */ 60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "PNG library is too old","`%s'",image_info->filename); 60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(Image *) NULL; 60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ReadPNGImage(image_info,exception)); 60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 606425c1e2baba76d9cf3ec582f217f96af95259e747glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 60663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 60683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 60693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r P N G I m a g e % 60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 60773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterPNGImage() adds properties for the PNG image format to 60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The properties include the image format 60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 60823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterPNGImage method is: 60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 6087bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterPNGImage(void) 60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 60893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6090bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterPNGImage(void) 60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy version[MaxTextExtent]; 60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy static const char 60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *PNGNote= 61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/ for details about the PNG format." 61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *JNGNote= 61043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the JNG\n" 61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *MNGNote= 61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the MNG\n" 61113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 61123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 61133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_LIBPNG_VER_STRING) 61163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,"libpng ",MaxTextExtent); 61173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,PNG_LIBPNG_VER_STRING,MaxTextExtent); 61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(PNG_LIBPNG_VER_STRING,png_get_header_ver(NULL)) != 0) 61193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,",",MaxTextExtent); 61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,png_get_libpng_ver(NULL), 61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("MNG"); 61263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->seekable_stream=MagickTrue; /* To do: eliminate this. */ 61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadMNGImage; 61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteMNGImage; 61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsMNG; 61323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Multiple-image Network Graphics"); 61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 61343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(MNGNote); 61373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG"); 61403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 61423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 61433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Portable Network Graphics"); 61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 61503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(PNGNote); 61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG8"); 61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 61563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString( 61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "8-bit indexed with optional binary transparency"); 61623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG24"); 61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(ZLIB_VERSION) 61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,"zlib ",MaxTextExtent); 61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,ZLIB_VERSION,MaxTextExtent); 61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(ZLIB_VERSION,zlib_version) != 0) 61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,",",MaxTextExtent); 61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,zlib_version,MaxTextExtent); 61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 61773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 61793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("opaque 24-bit RGB"); 61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG32"); 61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 61913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 61943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("opaque or transparent 32-bit RGBA"); 61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 61973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("JNG"); 62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadJNGImage; 62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteJNGImage; 62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsJNG; 62073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("JPEG Network Graphics"); 62093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(JNGNote); 62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 621218b17443128598500357da7bff2f01683cf32890cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 621318b17443128598500357da7bff2f01683cf32890cristy png_semaphore=AllocateSemaphoreInfo(); 621418b17443128598500357da7bff2f01683cf32890cristy#endif 62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r P N G I m a g e % 62243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage() removes format registrations made by the 62303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG module from the list of supported formats. 62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterPNGImage method is: 62333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage(void) 62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterPNGImage(void) 62383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("MNG"); 62403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG"); 62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG8"); 62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG24"); 62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG32"); 62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("JNG"); 62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 6246514e9e77a37d27ed811aca06ea6c300bc06cc1f2cristy if (png_semaphore != (SemaphoreInfo *) NULL) 6247514e9e77a37d27ed811aca06ea6c300bc06cc1f2cristy DestroySemaphoreInfo(&png_semaphore); 62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 625225c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if PNG_LIBPNG_VER > 10011 62533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 62543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 62553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e M N G I m a g e % 62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 62633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteMNGImage() writes an image in the Portable Network Graphics 62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Group's "Multiple-image Network Graphics" encoded image format. 62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 62683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteMNGImage method is: 62703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 62743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 62763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do (as of version 5.5.2, November 26, 2002 -- glennrp -- see also 62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "To do" under ReadPNGImage): 62823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Fix problem with palette sorting (when PNG_SORT_PALETTE is enabled, 62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% some GIF animations don't convert properly) 62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Write the iCCP chunk at MNG level when (icc profile length > 0) 62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Improve selection of color type (use indexed-colour or indexed-colour 62933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% with tRNS when 256 or fewer unique RGBA values are present). 62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Figure out what to do with "dispose=<restore-to-previous>" (dispose == 3) 62963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% This will be complicated if we limit ourselves to generating MNG-LC 62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files. For now we ignore disposal method 3 and simply overlay the next 62983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image on it. 62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical PLTE's or PLTE/tRNS combinations and use a 63013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% global MNG PLTE or PLTE/tRNS combination when appropriate. 63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% [mostly done 15 June 1999 but still need to take care of tRNS] 63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sRGB and replace with a global sRGB (and remove 63053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% gAMA/cHRM if sRGB is found; check for identical gAMA/cHRM and 63063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% replace with global gAMA/cHRM (or with sRGB if appropriate; replace 63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% local gAMA/cHRM with local sRGB if appropriate). 63083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sBIT chunks and write global ones. 63103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide option to skip writing the signature tEXt chunks. 63123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use signatures to detect identical objects and reuse the first 63143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instance of such objects instead of writing duplicate objects. 63153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use a smaller-than-32k value of compression window size when 63173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% appropriate. 63183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Encode JNG datastreams. Mostly done as of 5.5.2; need to write 63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary text chunks and save profiles. 63213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force LC files (to ensure exact framing rate) 63233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instead of VLC. 63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force VLC files instead of LC, even when offsets 63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% are present. This will involve expanding the embedded images with a 63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparent region at the top and/or left. 63283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 63293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63303ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristypng_write_raw_profile(const ImageInfo *image_info,png_struct *ping, 63323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info *ping_info, unsigned char *profile_type, unsigned char 63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile_description, unsigned char *profile_data, png_uint_32 length) 63343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 63353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 63373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6338bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 63403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 63423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *sp; 63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp; 63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 63483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length, 63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length; 63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 63523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 63533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((char *) profile_type+1, "ng-chunk-",9) == 0) 63553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return; 63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6359e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (void) printf("writing raw profile: type=%s, length=%.20g\n", 6360e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (char *) profile_type, (double) length); 63613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text)); 63633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length=(png_uint_32) strlen((const char *) profile_description); 63643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length=(png_uint_32) (length*2 + (length >> 5) + 20 63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy + description_length); 63663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text=(png_charp) png_malloc(ping,allocated_length); 63673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key=(png_charp) png_malloc(ping, (png_uint_32) 80); 63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key[0]='\0'; 63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key, 63703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Raw profile type ",MaxTextExtent); 63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key,(const char *) profile_type,62); 63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=profile_data; 63733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=text[0].text; 63743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 63753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(dp,(const char *) profile_description, 63763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length); 63773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=description_length; 63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 63793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(dp,allocated_length- 6380f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (png_size_t) (dp-text[0].text),"%8lu ",(unsigned long) length); 63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=8; 6382bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%36 == 0) 63853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 63863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp >> 4) & 0x0f)]; 63873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp++ ) & 0x0f)]; 63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp='\0'; 63913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length=(png_size_t) (dp-text[0].text); 63923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].compression=image_info->compression == NoCompression || 63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->compression == UndefinedCompression && 63943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length < 128) ? -1 : 0; 63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (text[0].text_length <= allocated_length) 63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_text(ping,ping_info,text,1); 63973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].text); 63983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].key); 63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text); 64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 64013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType png_write_chunk_from_profile(Image *image, 64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char *string, int logging) 64043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 64063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 64103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 64123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *data; 64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 length; 64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (name=GetNextImageProfile(image); name != (const char *) NULL; ){ 64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (const StringInfo *) NULL) 64203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png_profile; 64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare(name,string,11) == 0) { 64253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Found %s profile",name); 64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_profile=CloneStringInfo(profile); 64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data=GetStringInfoDatum(png_profile), 64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=(png_uint_32) GetStringInfoLength(png_profile); 64323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[4]=data[3]; 64333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[3]=data[2]; 64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[2]=data[1]; 64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[1]=data[0]; 64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,length-5); /* data length */ 64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length-1,data+1); 64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,data+1,(uInt) length-1)); 64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_profile=DestroyStringInfo(png_profile); 64403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 64463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, 64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info,Image *image) 64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 64503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Write one PNG image */ 64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 64523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s[2]; 64533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name, 64563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *property, 64573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 64603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 64613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 64643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte, 64653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 6466cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp pass; 6467cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp 6468e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp png_byte 6469e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_trans_alpha[256]; 64705af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 64713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 64733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_color_16 64755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background, 64765af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color; 64775af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 64793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 64823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64845af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_uint_32 64855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_height, 64865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_width; 64875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 6488bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 64893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 64903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 64923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 64933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 64963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register IndexPacket 64985c6f789db7a30bad01ace12b09ad9cd471339e94cristy *indexes; 64993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6500bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 65013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 65023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 65033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 65053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *png_pixels; 65063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 65083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 65093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte; 65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65115af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp volatile int 65125af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth, 65135af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type, 65145af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method, 65155af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method, 65165af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method, 65175af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans; 65185af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 6519bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 65203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_colors, 65215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth, 65225af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp old_bit_depth; 65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6524bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 65253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality, 65263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes, 65273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth; 65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 65303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " enter WriteOnePNGImage()"); 65313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 6533f84a193d5f435588cd78d521fff3f1f852e227f8cristy LockSemaphoreInfo(png_semaphore); 65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp /* Initialize some stuff */ 65375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=0, 65385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=0, 65395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=0, 65405af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method=0, 65415af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method=0, 65425af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans = 0; 65435af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 65445af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.red = 0; 65455af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.green = 0; 65465af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.blue = 0; 65475af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.gray = 0; 65485af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.index = 0; 65495af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 65505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red=0; 65515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green=0; 65525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue=0; 65535af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=0; 65545af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 6555ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy quantum_info = (QuantumInfo *) NULL; 65563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_colors=image->colors; 65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=image->depth; 65583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=image->matte; 65593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colorspace != RGBColorspace) 65613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) TransformImageColorspace(image,RGBColorspace); 65623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette=image->storage_class == PseudoClass && 65631449ea221d08431e12b667713077313a49000dc8cristy image_colors <= 256 && !IsOpaqueImage(image,&image->exception); 65643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->optimize=image_info->type == OptimizeType; 65653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 65673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 65683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 65693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 65703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping=png_create_write_struct_2(PNG_LIBPNG_VER_STRING,image, 65713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGErrorHandler,PNGWarningHandler,(void *) NULL, 65723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_malloc_ptr) png_IM_malloc,(png_free_ptr) png_IM_free); 65733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 65743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping=png_create_write_struct(PNG_LIBPNG_VER_STRING,image, 65753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGErrorHandler,PNGWarningHandler); 65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 65773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 65783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 65793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 65803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,(png_info **) NULL); 65833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_write_fn(ping,image,png_put_data,png_flush_data); 65863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) NULL; 65873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (setjmp(png_jmpbuf(ping))) 65893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 65913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG write failed. 65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_DEBUG 65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 65953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("PNG write has failed.\n"); 65963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 65973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 65983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 6599f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 66003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 66023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for writing. 66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 66063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 66073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 66083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 66093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 66103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 66153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x=0; 66164e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_width=(png_uint_32) image->columns; 66174e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_height=(png_uint_32) image->rows; 66183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) 66193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 66203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth != 0) 66213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=mng_info->write_png_depth; 66223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Adjust requested depth to next higher valid depth if necessary */ 66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 66243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=16; 66253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_depth > 4) && (image_depth < 8)) 66263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 66273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 3) 66283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=4; 66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 66303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6632e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " width=%.20g",(double) ping_width); 66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6634e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " height=%.20g",(double) ping_height); 66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6636e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_matte=%.20g",(double) image->matte); 66373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6638e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_depth=%.20g",(double) image->depth); 66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6640e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " requested PNG image_depth=%.20g",(double) image->depth); 66413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth=image_depth; 66435af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=(png_byte) save_image_depth; 66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 66453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->x_resolution != 0) && (image->y_resolution != 0) && 66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_mng || !mng_info->equal_physs)) 66473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 66493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unit_type; 66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_resolution, 66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_resolution; 66543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unit_type=PNG_RESOLUTION_METER; 66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_resolution=(png_uint_32) (100.0*image->x_resolution/2.54); 66593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_resolution=(png_uint_32) (100.0*image->y_resolution/2.54); 66603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (image->units == PixelsPerCentimeterResolution) 66623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unit_type=PNG_RESOLUTION_METER; 66643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_resolution=(png_uint_32) (100.0*image->x_resolution); 66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_resolution=(png_uint_32) (100.0*image->y_resolution); 66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unit_type=PNG_RESOLUTION_UNKNOWN; 66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_resolution=(png_uint_32) image->x_resolution; 66713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_resolution=(png_uint_32) image->y_resolution; 66723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_pHYs(ping,ping_info,x_resolution,y_resolution,unit_type); 66743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 66753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 66763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up pHYs chunk"); 66773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 66793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_oFFs_SUPPORTED) 66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x || image->page.y) 66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_oFFs(ping,ping_info,(png_int_32) image->page.x, 66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_int_32) image->page.y, 0); 66843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 66853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 66863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up oFFs chunk"); 66873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 66893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte && (!mng_info->adjoin || !mng_info->equal_backgrounds)) 66903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_16 66923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background; 66933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth < MAGICKCORE_QUANTUM_DEPTH) 66953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6696bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval; 66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval=(1UL << image_depth)-1; 67003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.red=(png_uint_16) 67013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (QuantumScale*(maxval*image->background_color.red)); 67023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.green=(png_uint_16) 67033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (QuantumScale*(maxval*image->background_color.green)); 67043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.blue=(png_uint_16) 67053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (QuantumScale*(maxval*image->background_color.blue)); 67063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.gray=(png_uint_16) 67073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (QuantumScale*(maxval*PixelIntensity(&image->background_color))); 67083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.red=image->background_color.red; 67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.green=image->background_color.green; 67133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.blue=image->background_color.blue; 67143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.gray= 67153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_uint_16) PixelIntensity(&image->background_color); 67163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.index=(png_byte) background.gray; 67183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 67203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up bKGd chunk"); 67213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_bKGD(ping,ping_info,&background); 67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Select the color type. 67253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_bit_depth=0; 672879f9995ecaa0e0daae607e9e88f257706730084dcristy if ((mng_info->write_png_colortype-1) == PNG_COLOR_TYPE_PALETTE) 672979f9995ecaa0e0daae607e9e88f257706730084dcristy mng_info->write_png8=MagickTrue; 67303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8) 67313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67325af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 67335af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 67345af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* TO DO: make this a function cause it's used twice, except 67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for reducing the sample depth from 8. */ 67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantizeInfo 67403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantize_info; 67413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6742bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors, 67443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_number_colors; 67453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors=image_colors; 67473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->storage_class == DirectClass) || (number_colors > 256)) 67483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetQuantizeInfo(&quantize_info); 67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantize_info.dither=IsPaletteImage(image,&image->exception) == 67513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickFalse ? MagickTrue : MagickFalse; 67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantize_info.number_colors= (matte != MagickFalse ? 255UL : 67533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 256UL); 67543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) QuantizeImage(&quantize_info,image); 67553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors=image_colors; 67563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SyncImage(image); 67573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6759e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Colors quantized to %.20g",(double) number_colors); 67603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte) 67625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 67643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image palette. 67653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 67665af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 67673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SORT_PALETTE) 67683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_number_colors=image_colors; 67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (CompressColormapTransFirst(image) == MagickFalse) 67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 677198156a3a465a004545e39434c63052b955a74d1cglennrp number_colors=image->colors; 67723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_colors=save_number_colors; 67733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 67743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette=(png_color *) AcquireQuantumMemory(257, 67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*palette)); 67763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (palette == (png_color *) NULL) 67773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 67783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 678098156a3a465a004545e39434c63052b955a74d1cglennrp " Setting up PLTE chunk with %d colors", 678198156a3a465a004545e39434c63052b955a74d1cglennrp (int) number_colors); 6782bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 67833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if MAGICKCORE_QUANTUM_DEPTH == 8 67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " %3ld (%3d,%3d,%3d)", 67913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " %5ld (%5d,%5d,%5d)", 67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6794f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (long) i,palette[i].red,palette[i].green,palette[i].blue); 67953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte) 67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors++; 68003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar((Quantum) QuantumRange); 68013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar((Quantum) QuantumRange); 68023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar((Quantum) QuantumRange); 68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_PLTE(ping,ping_info,palette,(int) number_colors); 68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette=(png_colorp) RelinquishMagickMemory(palette); 68065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 68075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 68083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte) 68093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo 68113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *exception; 68123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68135af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp int 68145af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp trans_alpha[256]; 68155af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 68173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Identify which colormap entry is transparent. 68183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(number_colors <= 256); 6820bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 68215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp trans_alpha[i]=255; 68223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception=(&image->exception); 6823bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 68243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 68273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetAuthenticPixels(image,0,y,image->columns,1,exception); 68293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (PixelPacket *) NULL) 68303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 68315c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes=GetAuthenticIndexQueue(image); 6832bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->opacity != OpaqueOpacity) 68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68365c6f789db7a30bad01ace12b09ad9cd471339e94cristy indexes[x]=(IndexPacket) (number_colors-1); 6837bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy trans_alpha[(ssize_t) indexes[x]]=(png_byte) (255- 6838ce70c17bb6433add2eb069515a4f3105989e0662cristy ScaleQuantumToChar(GetOpacityPixelComponent(p))); 68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6845bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 68465af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (trans_alpha[i] != 255) 68475af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=(unsigned short) (i+1); 68485af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 68495af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_num_trans == 0) 68505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping, ping_info, PNG_INFO_tRNS); 68515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (!png_get_valid(ping, ping_info, PNG_INFO_tRNS)) 68525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 68535af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_num_trans != 0) 68545af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp { 68555af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp for (i=0; i<256; i++) 68565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_alpha[i]=(png_byte) trans_alpha[i]; 68575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp } 68585af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 68595af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (void) png_set_tRNS(ping, ping_info, 68605af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_alpha, 68615af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans, 68625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp &ping_trans_color); 68633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 68653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Identify which colormap entry is the background color. 68663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6867bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) 68685af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (IsPNGColorEqual(ping_background,image->colormap[i])) 68693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 68705af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.index=(png_byte) i; 68713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte != MagickFalse) 68733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* TO DO: reduce to binary transparency */ 68753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* end of write_png8 */ 68773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (mng_info->write_png24) 68783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 68805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (mng_info->write_png32) 68833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 68855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 68863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 68883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68895af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 68903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 68913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68925af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) mng_info->write_png_colortype-1; 6893b905e45f528487c0e1c2a28b86b89f8ed86433a0cristy image_matte=MagickFalse; 68945af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 68955af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Selecting PNG colortype"); 69035af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) ((matte == MagickTrue)? 69043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_RGB_ALPHA:PNG_COLOR_TYPE_RGB); 69053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(image_info->type == TrueColorType) 69063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 69093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(image_info->type == TrueColorMatteType) 69113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69125af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 69143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->type == UndefinedType || 69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->type == OptimizeType || 69173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->type == GrayscaleType) && 69183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte == MagickFalse && ImageIsGray(image)) 69193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69205af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 69223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->type == UndefinedType || 69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->type == OptimizeType || 69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->type == GrayscaleMatteType) && 69263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte == MagickTrue && ImageIsGray(image)) 69273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69285af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY_ALPHA; 69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69345af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp "Selected PNG colortype=%d",ping_color_type); 69353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 69373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 69395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB || 69405af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 69415af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69445af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte == MagickFalse && image->colors < 256) 69473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ImageIsMonochrome(image)) 69493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 69515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < (int)mng_info->write_png_depth) 69525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth = mng_info->write_png_depth; 69533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 695835ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one = 1; 69595af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 69600f111984738842d27d04aed2a3f823d82a943506glennrp 69610f111984738842d27d04aed2a3f823d82a943506glennrp if (image->colors == 0) 69620f111984738842d27d04aed2a3f823d82a943506glennrp { 69630f111984738842d27d04aed2a3f823d82a943506glennrp /* DO SOMETHING */ 69640f111984738842d27d04aed2a3f823d82a943506glennrp (void) ThrowMagickException(&image->exception, 69650f111984738842d27d04aed2a3f823d82a943506glennrp GetMagickModule(),CoderError, 69660f111984738842d27d04aed2a3f823d82a943506glennrp "image has 0 colors", "`%s'",""); 69670f111984738842d27d04aed2a3f823d82a943506glennrp } 69680f111984738842d27d04aed2a3f823d82a943506glennrp 69690f111984738842d27d04aed2a3f823d82a943506glennrp if (logging != MagickFalse) 69700f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69710f111984738842d27d04aed2a3f823d82a943506glennrp " SyncImage.2."); 697235ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) < (ssize_t) image_colors) 69735af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6978e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Number of colors: %.20g",(double) image_colors); 69793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " Tentative PNG bit depth: %d",ping_bit_depth); 69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69845af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp old_bit_depth=ping_bit_depth; 69855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < (int)mng_info->write_png_depth) 69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth = mng_info->write_png_depth; 69885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth > 8) 69895af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth = 8; 69905af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth != (int) old_bit_depth) 69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6994e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Colors increased to %.20g",(double) 6995f2faecf9facdbbb14fcba373365f9f691a9658e0cristy image_colors); 69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70015af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7005e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Tentative PNG color type: %.20g",(double) ping_color_type); 70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7007e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_info->type: %.20g",(double) image_info->type); 70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7009e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_depth: %.20g",(double) image_depth); 70103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7011e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " ping_bit_depth: %.20g",(double) ping_bit_depth); 70123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte && (mng_info->optimize || mng_info->IsPalette)) 70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,0,image->columns,1,&image->exception); 70205af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 7021bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 70253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7026bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsGray(p) == MagickFalse) 70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70305af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine if there is any transparent color. 70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7039bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7044bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 70453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->opacity != OpaqueOpacity) 70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 70493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x != 0) 70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7053bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((y == (ssize_t) image->rows) && (x == (ssize_t) image->columns)) 70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp No transparent pixels are present. Change 4 or 6 to 0 or 2. 70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 70595af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type&=0x03; 70603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 70623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 70643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask; 70653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask=0xffff; 70675af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth == 8) 70683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask=0x00ff; 70695af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth == 4) 70703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask=0x000f; 70715af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth == 2) 70723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask=0x0003; 70735af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth == 1) 70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mask=0x0001; 70755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red=(png_uint_16) 7076ce70c17bb6433add2eb069515a4f3105989e0662cristy (ScaleQuantumToShort(GetRedPixelComponent(p)) & mask); 70775af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green=(png_uint_16) 7078ce70c17bb6433add2eb069515a4f3105989e0662cristy (ScaleQuantumToShort(GetGreenPixelComponent(p)) & mask); 70795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue=(png_uint_16) 7080ce70c17bb6433add2eb069515a4f3105989e0662cristy (ScaleQuantumToShort(GetBluePixelComponent(p)) & mask); 70815af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=(png_uint_16) 70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (ScaleQuantumToShort(PixelIntensityToQuantum(p)) & mask); 70835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.index=(png_byte) 708446f08209f719f4adeea742c45873c2714e80cdb9cristy (ScaleQuantumToChar((Quantum) (GetAlphaPixelComponent(p)))); 70855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (void) png_set_tRNS(ping, ping_info, NULL, 0, 70865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp &ping_trans_color); 70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine if there is one and only one transparent color 70923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy and if so if it is fully transparent. 70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7094bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1, 70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 70983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x=0; 70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 7101bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 71023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->opacity != OpaqueOpacity) 71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71055af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (IsPNGColorEqual(ping_trans_color,*p) == 0) 71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; /* Can't use RGB + tRNS for multiple 71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent colors. */ 71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->opacity != (Quantum) TransparentOpacity) 71113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; /* Can't use RGB + tRNS for 71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy semitransparency. */ 71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71185af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (IsPNGColorEqual(ping_trans_color,*p)) 71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; /* Can't use RGB + tRNS when another pixel 71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy having the same RGB samples is 71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent. */ 71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 71243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7125217484eb7236f4f3527af0feb39a6dc19a3302fecristy if (x >= 0) 71263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7128217484eb7236f4f3527af0feb39a6dc19a3302fecristy if (x >= 0) 71295af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71315af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71335af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type &= 0x03; /* changes 4 or 6 to 0 or 2 */ 71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 8) 71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red&=0xff; 71375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green&=0xff; 71385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue&=0xff; 71395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray&=0xff; 71403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 71445af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->optimize || mng_info->IsPalette) && 71473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE && 71483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageIsGray(image) && (!image_matte || image_depth >= 8)) 71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 715035ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one=1; 71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte != MagickFalse) 71529c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71555af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=PNG_COLOR_TYPE_GRAY; 71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (save_image_depth == 16 && image_depth == 8) 71575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray*=0x0101; 71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > MAGICKCORE_QUANTUM_DEPTH) 71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=MAGICKCORE_QUANTUM_DEPTH; 71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_colors == 0 || image_colors-1 > MaxColormapSize) 716235ef824baa82511126ff0072ae30eee0da9c05a3cristy image_colors=one << image_depth; 71633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 71645af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=16; 71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71675af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 71685af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(!mng_info->write_png_depth) 71713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71725af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 717335ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) 7174bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy < (ssize_t) image_colors) 71755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 71763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp else if (mng_info->optimize && ping_color_type == 71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_GRAY && image_colors < 17 && 71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette) 71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if grayscale is reducible */ 71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 71853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=MagickTrue, 71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=MagickTrue, 71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickTrue; 71883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7189bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image_colors; i++) 71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity; 71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity=ScaleQuantumToChar(image->colormap[i].red); 71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((intensity & 0x0f) != ((intensity & 0xf0) >> 4)) 71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=depth_2_ok=depth_1_ok=MagickFalse; 71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if ((intensity & 0x03) != ((intensity & 0x0c) >> 2)) 71993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=depth_1_ok=MagickFalse; 72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) 72013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickFalse; 72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth_1_ok && mng_info->write_png_depth <= 1) 72049c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=1; 72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_2_ok && mng_info->write_png_depth <= 2) 72069c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=2; 72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_4_ok && mng_info->write_png_depth <= 4) 72089c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=4; 72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72115af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 72153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7216bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 721717a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors; 721817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 721917a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 722017a1485544c62993fc7a94e343c87fed5f3e6407glennrp 72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth <= 8) 72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image palette. 72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 72265af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_write_global_plte && !matte) 72283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72299c1eb0729653219b9da9037e044501a6dce79d10glennrp png_set_PLTE(ping,ping_info,NULL,0); 72309c1eb0729653219b9da9037e044501a6dce79d10glennrp if (logging) 72319c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 72329c1eb0729653219b9da9037e044501a6dce79d10glennrp " Setting up empty PLTE chunk"); 72333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SORT_PALETTE) 7237bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_number_colors; 72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->optimize) 72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_number_colors=image_colors; 72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (CompressColormapTransFirst(image) == MagickFalse) 72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError, 72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 724698156a3a465a004545e39434c63052b955a74d1cglennrp number_colors=image->colors; 72473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_colors=save_number_colors; 72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette=(png_color *) AcquireQuantumMemory(257, 72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*palette)); 72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (palette == (png_color *) NULL) 72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError, 72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 7255bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 72563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging) 72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 726398156a3a465a004545e39434c63052b955a74d1cglennrp " Setting up PLTE chunk with %d colors", 726498156a3a465a004545e39434c63052b955a74d1cglennrp (int) number_colors); 72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_PLTE(ping,ping_info,palette,(int) number_colors); 72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette=(png_colorp) RelinquishMagickMemory(palette); 72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* color_type is PNG_COLOR_TYPE_PALETTE */ 72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (!mng_info->write_png_depth) 72703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7271befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 7272befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 7273befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 72745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 7275befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 7276befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy while ((one << ping_bit_depth) < number_colors) 72775af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (matte) 72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ExceptionInfo 72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *exception; 72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy trans[256]; 72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const IndexPacket 72925c6f789db7a30bad01ace12b09ad9cd471339e94cristy *packet_indexes; 72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Identify which colormap entry is transparent. 72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(number_colors <= 256); 7298bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy trans[i]=256; 73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception=(&image->exception); 7301bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 73065c6f789db7a30bad01ace12b09ad9cd471339e94cristy packet_indexes=GetVirtualIndexQueue(image); 7307bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->opacity != OpaqueOpacity) 73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IndexPacket 73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy packet_index; 73133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73145c6f789db7a30bad01ace12b09ad9cd471339e94cristy packet_index=packet_indexes[x]; 7315bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert((size_t) packet_index < number_colors); 7316bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (trans[(ssize_t) packet_index] != 256) 73173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7318bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (trans[(ssize_t) packet_index] != (png_byte) (255- 7319ce70c17bb6433add2eb069515a4f3105989e0662cristy ScaleQuantumToChar(GetOpacityPixelComponent(p)))) 73203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) 73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_RGB_ALPHA; 73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7326bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy trans[(ssize_t) packet_index]=(png_byte) (255- 7327ce70c17bb6433add2eb069515a4f3105989e0662cristy ScaleQuantumToChar(GetOpacityPixelComponent(p))); 73283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73315af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 73323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73335af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 73345af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 73355af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping,ping_info,PNG_INFO_PLTE); 73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette=MagickFalse; 73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SyncImage(image); 73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging) 73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent, GetMagickModule(), 73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Cannot write image as indexed PNG, writing RGBA."); 73413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 73423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73445af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7346bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (trans[i] == 256) 73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy trans[i]=255; 73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (trans[i] != 255) 73515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=(unsigned short) (i+1); 73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73545af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_num_trans == 0) 73555af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 73565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (!png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 73575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 73585af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_num_trans != 0) 73599c1eb0729653219b9da9037e044501a6dce79d10glennrp { 73609c1eb0729653219b9da9037e044501a6dce79d10glennrp for (i=0; i < (ssize_t) number_colors; i++) 73619c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_trans_alpha[i]=(png_byte) trans[i]; 73629c1eb0729653219b9da9037e044501a6dce79d10glennrp } 73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth < 8) 73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((save_image_depth == 16) && (image_depth == 8)) 73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73735af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red*=0x0101; 73745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green*=0x0101; 73755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue*=0x0101; 73765af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray*=0x0101; 73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Adjust background and transparency samples in sub-8-bit grayscale files. 73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 73835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8 && ping_color_type == 73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_GRAY) 73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval; 73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_16 73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background; 73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 739235ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 739335ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 739435ef824baa82511126ff0072ae30eee0da9c05a3cristy 739522ffd97a7a54140ebcfe886af90cbdb7bfe41e89cristy maxval=(png_uint_16) ((one << ping_bit_depth)-1); 73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.gray=(png_uint_16) 73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (QuantumScale*(maxval*(PixelIntensity(&image->background_color)))); 74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up bKGD chunk"); 74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_bKGD(ping,ping_info,&background); 74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=(png_uint_16) (QuantumScale*(maxval* 74075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray)); 74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 740917a1485544c62993fc7a94e343c87fed5f3e6407glennrp 741017a1485544c62993fc7a94e343c87fed5f3e6407glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 741117a1485544c62993fc7a94e343c87fed5f3e6407glennrp { 741217a1485544c62993fc7a94e343c87fed5f3e6407glennrp /* 741317a1485544c62993fc7a94e343c87fed5f3e6407glennrp Identify which colormap entry is the background color. 741417a1485544c62993fc7a94e343c87fed5f3e6407glennrp */ 741517a1485544c62993fc7a94e343c87fed5f3e6407glennrp 7416bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 741717a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors; 741817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 741917a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 742017a1485544c62993fc7a94e343c87fed5f3e6407glennrp 7421bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) 742217a1485544c62993fc7a94e343c87fed5f3e6407glennrp if (IsPNGColorEqual(ping_background,image->colormap[i])) 742317a1485544c62993fc7a94e343c87fed5f3e6407glennrp break; 742417a1485544c62993fc7a94e343c87fed5f3e6407glennrp 742517a1485544c62993fc7a94e343c87fed5f3e6407glennrp ping_background.index=(png_byte) i; 742617a1485544c62993fc7a94e343c87fed5f3e6407glennrp 742717a1485544c62993fc7a94e343c87fed5f3e6407glennrp if (logging) 742817a1485544c62993fc7a94e343c87fed5f3e6407glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 742917a1485544c62993fc7a94e343c87fed5f3e6407glennrp " Setting up bKGD chunk with index=%d",(int) i); 743017a1485544c62993fc7a94e343c87fed5f3e6407glennrp 743117a1485544c62993fc7a94e343c87fed5f3e6407glennrp png_set_bKGD(ping,ping_info,&ping_background); 743217a1485544c62993fc7a94e343c87fed5f3e6407glennrp } 743317a1485544c62993fc7a94e343c87fed5f3e6407glennrp 74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG color type: %d",ping_color_type); 74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 74383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize compression level and filtering. 74393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 74403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up deflate compression"); 74433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression buffer size: 32768"); 74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_buffer_size(ping,32768L); 74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression mem level: 9"); 74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_mem_level(ping, 9); 74513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality=image->quality == UndefinedCompressionQuality ? 75UL : 74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->quality; 74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quality > 9) 74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 74563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy level; 74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7458bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy level=(int) MagickMin((ssize_t) quality/10,9); 74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression level: %d",level); 74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_level(ping,level); 74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression strategy: Z_HUFFMAN_ONLY"); 74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_strategy(ping, Z_HUFFMAN_ONLY); 74703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up filtering"); 74743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) && defined(PNG_INTRAPIXEL_DIFFERENCING) 74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* This became available in libpng-1.0.9. Output must be a MNG. */ 74773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng && ((quality % 10) == 7)) 74783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Filter_type: PNG_INTRAPIXEL_DIFFERENCING"); 74825af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING; 74833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Filter_type: 0"); 74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy base_filter; 74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((quality % 10) > 5) 74943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy base_filter=PNG_ALL_FILTERS; 74953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 74963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((quality % 10) != 5) 74973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy base_filter=(int) quality % 10; 74983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 74995af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 75005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 75013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (quality < 50)) 75023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy base_filter=PNG_NO_FILTERS; 75033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 75043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy base_filter=PNG_ALL_FILTERS; 75053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 75063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (base_filter == PNG_ALL_FILTERS) 75083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Base filter method: ADAPTIVE"); 75103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 75113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Base filter method: NONE"); 75133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_filter(ping,PNG_FILTER_TYPE_BASE,base_filter); 75153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 75183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 75193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 75213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (StringInfo *) NULL) 75223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75235af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp#ifdef PNG_WRITE_iCCP_SUPPORTED 75243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((LocaleCompare(name,"ICC") == 0) || 75253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (LocaleCompare(name,"ICM") == 0)) 75263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_iCCP(ping,ping_info,(const png_charp) name,0,(png_charp) 75273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetStringInfoDatum(profile), 75283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_uint_32) GetStringInfoLength(profile)); 75293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 75303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 75313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_raw_profile(image_info,ping,ping_info,(unsigned char *) 75323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name,(unsigned char *) name,GetStringInfoDatum(profile), 75333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (png_uint_32) GetStringInfoLength(profile)); 75343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 75363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up text chunk with %s profile",name); 75383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 75393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_sRGB_SUPPORTED) 75423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_srgb == 0) && 75433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->rendering_intent != UndefinedIntent) || 75443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->colorspace == sRGBColorspace))) 75453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 75473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image rendering intent. 75483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 75493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 75503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up sRGB chunk"); 7552e610a071534e448c46460a5aa39ede33bf56b329glennrp (void) png_set_sRGB(ping,ping_info,( 7553e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 7554e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent))); 75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_gAMA(ping,ping_info,0.45455); 75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((!mng_info->write_mng) || (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_gama == 0) && (image->gamma != 0.0)) 75613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image gamma. 75643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up gAMA chunk"); 75693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_gAMA(ping,ping_info,image->gamma); 75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_chrm == 0) && 75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->chromaticity.red_primary.x != 0.0)) 75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image chromaticity. 75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bp, 75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy gp, 75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rp, 75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy wp; 75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy wp=image->chromaticity.white_point; 75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rp=image->chromaticity.red_primary; 75863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy gp=image->chromaticity.green_primary; 75873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bp=image->chromaticity.blue_primary; 75883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 75903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 75913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up cHRM chunk"); 75923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_cHRM(ping,ping_info,wp.x,wp.y,rp.x,rp.y,gp.x,gp.y, 75933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bp.x,bp.y); 75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 75965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=image_info->interlace != NoInterlace; 75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 75993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sig_bytes(ping,8); 76003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Bail out if cannot meet defined PNG:bit-depth or PNG:color-type */ 76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY) 76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ImageIsGray(image) == MagickFalse) 76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76085af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type = PNG_COLOR_TYPE_RGB; 76095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 76105af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 76113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY_ALPHA) 76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ImageIsGray(image) == MagickFalse) 76155af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type = PNG_COLOR_TYPE_RGB_ALPHA; 76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->write_png_depth && 76195af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (int) mng_info->write_png_depth != ping_bit_depth) || 76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->write_png_colortype && 76215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ((int) mng_info->write_png_colortype-1 != ping_color_type && 7622991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp mng_info->write_png_colortype != 7 && 76235af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp !(mng_info->write_png_colortype == 5 && ping_color_type == 0)))) 76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 76263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Defined PNG:bit-depth=%u, Computed depth=%u", 76313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth, 76325af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth); 76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Defined PNG:color-type=%u, Computed color type=%u", 76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1, 76395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type); 76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76423bd2e411d0f07c705a40c2c73ce7eda3f1f03e0cglennrp png_warning(ping, 76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Cannot write image with defined PNG:bit-depth or PNG:color-type."); 76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte && !image->matte) 76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Add an opaque matte channel */ 76493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte = MagickTrue; 76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageOpacity(image,0); 7651b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging != MagickFalse) 7652b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7653b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Added an opaque matte channel"); 76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7656e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp if (image->matte == MagickTrue && ping_color_type < 4) 7657e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp { 7658e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp if (ping_color_type == 3 && ping_num_trans == 0) 7659e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp { 7660e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 7661e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp if (logging != MagickFalse) 7662e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7663e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp " Ignoring request to write tRNS chunk with num_trans==0"); 7664e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp } 7665e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp else 7666e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp (void) png_set_tRNS(ping, ping_info, 7667e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_trans_alpha, 7668e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_num_trans, 7669e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp &ping_trans_color); 7670e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp } 7671e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp 76723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 76733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 76743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG header chunks"); 76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76765af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_IHDR(ping,ping_info,ping_width,ping_height, 76775af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth,ping_color_type, 76785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method,ping_compression_method, 76795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method); 76805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 76813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info_before_PLTE(ping, ping_info); 76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any png-chunk-b profiles */ 76833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_write_chunk_from_profile(image,"PNG-chunk-b",(int) logging); 76843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info(ping,ping_info); 76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-m profiles */ 76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_write_chunk_from_profile(image,"PNG-chunk-m",(int) logging); 76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.width || image->page.height) 76893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 76909c1eb0729653219b9da9037e044501a6dce79d10glennrp unsigned char 76919c1eb0729653219b9da9037e044501a6dce79d10glennrp chunk[14]; 76929c1eb0729653219b9da9037e044501a6dce79d10glennrp 76939c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 76949c1eb0729653219b9da9037e044501a6dce79d10glennrp PNGType(chunk,mng_vpAg); 76959c1eb0729653219b9da9037e044501a6dce79d10glennrp LogPNGChunk((int) logging,mng_vpAg,9L); 76969c1eb0729653219b9da9037e044501a6dce79d10glennrp PNGLong(chunk+4,(png_uint_32) image->page.width); 76979c1eb0729653219b9da9037e044501a6dce79d10glennrp PNGLong(chunk+8,(png_uint_32) image->page.height); 76989c1eb0729653219b9da9037e044501a6dce79d10glennrp chunk[12]=0; /* unit = pixels */ 76999c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) WriteBlob(image,13,chunk); 77009c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (PNG_LIBPNG_VER == 10206) 77049c1eb0729653219b9da9037e044501a6dce79d10glennrp /* avoid libpng-1.2.6 bug by setting PNG_HAVE_IDAT flag */ 77053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_HAVE_IDAT 0x04 77069c1eb0729653219b9da9037e044501a6dce79d10glennrp ping->mode |= PNG_HAVE_IDAT; 77073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef PNG_HAVE_IDAT 77083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 77093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_packing(ping); 77113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 77123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate memory. 77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes=image->columns; 7715b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (image_depth > 8) 7716b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 77177202c101b42be63076be56386f79429bb2f39784cristy switch (ping_color_type) 77183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7719b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGB: 77203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=3; 7721b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 7722b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 7723b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 7724b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 7725b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGBA: 77263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=4; 7727b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 7728b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp default: 7729b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 77303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7731b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging) 77323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7733b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7734b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing PNG image data"); 7735b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7736e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Allocating %.20g bytes of memory for pixels",(double) rowbytes); 77373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 77383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) AcquireQuantumMemory(rowbytes, 77393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*png_pixels)); 77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_pixels == (unsigned char *) NULL) 77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 77423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 77433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image scanlines. 77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 77455af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (setjmp(png_jmpbuf(ping))) 77463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 77483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG write failed. 77493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 77503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_DEBUG 77513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 77523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("PNG write has failed.\n"); 77533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 77553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_info != (QuantumInfo *) NULL) 77563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info=DestroyQuantumInfo(quantum_info); 77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_pixels != (unsigned char *) NULL) 77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) RelinquishMagickMemory(png_pixels); 77593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 7760f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 77613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 77623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 77633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7764ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy quantum_info=AcquireQuantumInfo(image_info,image); 7765ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy if (quantum_info == (QuantumInfo *) NULL) 7766ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->format=UndefinedQuantumFormat; 77683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=image_depth; 77693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!mng_info->write_png8 && !mng_info->write_png24 && 77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !mng_info->write_png32) && 77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->optimize || mng_info->IsPalette || 77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->type == BilevelType)) && 77743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !image_matte && ImageIsMonochrome(image)) 77753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 77773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 77783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 77803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 77813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a PNG monochrome image. 77843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 7785bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 77883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 77893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 77903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 77913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 77933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,GrayQuantum,png_pixels,&image->exception); 77943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE && 77953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth && 77963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth != old_bit_depth) 77973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Undo pixel scaling */ 7799bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 78003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(png_pixels+i)=(unsigned char) (*(png_pixels+i) 78013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy >> (8-old_bit_depth)); 78023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 78053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,RedQuantum,png_pixels,&image->exception); 78083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE) 7810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 78113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(png_pixels+i)=(unsigned char) ((*(png_pixels+i) > 127) ? 78123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 255 : 0); 7813b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7814b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7815b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (1)"); 78163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_row(ping,png_pixels); 78173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 78193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 78213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 78223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 78233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 78273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 78283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register const PixelPacket 78303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 78313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 78323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!mng_info->write_png8 && !mng_info->write_png24 && 78333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !mng_info->write_png32) && 78343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_matte || 78355af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_bit_depth >= MAGICKCORE_QUANTUM_DEPTH)) && 78363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->optimize || mng_info->IsPalette) && ImageIsGray(image)) 78373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7838bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 78393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 78413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 78423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 78435af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 78443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 78463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,GrayQuantum,png_pixels,&image->exception); 78483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 78493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,RedQuantum,png_pixels,&image->exception); 7851b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7852b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7853b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing GRAY PNG pixels (2)"); 78543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* PNG_COLOR_TYPE_GRAY_ALPHA */ 78563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7857b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7858b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7859b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing GRAY_ALPHA PNG pixels (2)"); 78603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,GrayAlphaQuantum,png_pixels,&image->exception); 78623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7863b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7864b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7865b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (2)"); 78663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_row(ping,png_pixels); 78673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 78693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 78713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 78723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 78733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 78763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 78773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_depth > 8) || (mng_info->write_png24 || 78793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32 || 78803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_png8 && !mng_info->IsPalette))) 7881bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 78823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 78843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 78853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 78865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 78873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 78883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 78893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,RedQuantum,png_pixels,&image->exception); 78913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 78923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 78933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,GrayQuantum,png_pixels,&image->exception); 78943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 78955af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 7896b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 7897b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) ExportQuantumPixels(image,(const CacheView *) NULL, 7898b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp quantum_info,GrayAlphaQuantum,png_pixels,&image->exception); 7899b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7900b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7901b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing GRAY_ALPHA PNG pixels (3)"); 7902b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 79033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (image_matte != MagickFalse) 79043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 79053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,RGBAQuantum,png_pixels,&image->exception); 79063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 79073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 79083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,RGBQuantum,png_pixels,&image->exception); 7909b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging && y == 0) 7910b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7911b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (3)"); 79123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_row(ping,png_pixels); 79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 79153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* not ((image_depth > 8) || (mng_info->write_png24 || 79163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32 || 79173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_png8 && !mng_info->IsPalette))) */ 79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79195af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((ping_color_type != PNG_COLOR_TYPE_GRAY) && 79205af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_color_type != PNG_COLOR_TYPE_GRAY_ALPHA)) 79213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging) 79233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " pass %d, Image Is not GRAY or GRAY_ALPHA",pass); 79253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 79263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 79273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7928bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 79293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7930e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp if (logging && y == 0) 79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); 79333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=GetVirtualPixels(image,0,y,image->columns,1,&image->exception); 79343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p == (const PixelPacket *) NULL) 79353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 79365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 79373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 79383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,GrayQuantum,png_pixels,&image->exception); 79395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 7940b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 794107cd77aff3a2230f1ba3fc97f24f585b3682ff1fglennrp if (logging && y == 0) 7942b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7943b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing GRAY_ALPHA PNG pixels (4)"); 7944b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) ExportQuantumPixels(image,(const CacheView *) NULL, 7945b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp quantum_info,GrayAlphaQuantum,png_pixels,&image->exception); 7946b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 79473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 79483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ExportQuantumPixels(image,(const CacheView *) NULL, 79493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info,IndexQuantum,png_pixels,&image->exception); 795007cd77aff3a2230f1ba3fc97f24f585b3682ff1fglennrp if (logging && y == 0) 7951b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7952b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (4)"); 79533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_row(ping,png_pixels); 79543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 79573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 79593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 79603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 79613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7964b32b90a7e1ee2275333589072c496b5f69e17feccristy if (quantum_info != (QuantumInfo *) NULL) 7965b32b90a7e1ee2275333589072c496b5f69e17feccristy quantum_info=DestroyQuantumInfo(quantum_info); 79663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 79683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7970b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Wrote PNG image data"); 79713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7972e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Width: %.20g",(double) ping_width); 79733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7974e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Height: %.20g",(double) ping_height); 79753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 79763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Defined PNG:bit-depth: %d",mng_info->write_png_depth); 79793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79815af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG bit-depth written: %d",ping_bit_depth); 79823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 79833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Defined PNG:color-type: %d",mng_info->write_png_colortype-1); 79863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG color-type written: %d",ping_color_type); 79893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 79905af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG Interlace method: %d",ping_interlace_method); 79913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 79923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 79933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Generate text chunks. 79943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 79953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImagePropertyIterator(image); 79963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy property=GetNextImageProperty(image); 79973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (property != (const char *) NULL) 79983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 79993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 80003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 80013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageProperty(image,property); 80033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (const char *) NULL) 80043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 80053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text)); 80063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key=(char *) property; 80073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text=(char *) value; 80083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length=strlen(value); 80093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].compression=image_info->compression == NoCompression || 80103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->compression == UndefinedCompression && 80113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length < 128) ? -1 : 0; 80123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 80133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 80143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 80153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up text chunk"); 80163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 80173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " keyword: %s",text[0].key); 80183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_text(ping,ping_info,text,1); 80203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text); 80213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 80223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy property=GetNextImageProperty(image); 80233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 80243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-e profiles */ 80263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_write_chunk_from_profile(image,"PNG-chunk-e",(int) logging); 80273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 80293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 80303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG end info"); 80313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_end(ping,ping_info); 80323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && (int) image->dispose == BackgroundDispose) 80333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 80343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.x || mng_info->page.y || 80355af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_width != mng_info->page.width) || 80365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_height != mng_info->page.height)) 80373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 80383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 80393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[32]; 80403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 80423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write FRAM 4 with clipping boundaries followed by FRAM 1. 80433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 80443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,27L); /* data length=27 */ 80453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 80463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_FRAM,27L); 80473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=4; 80483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 80493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=1; /* flag for changing delay, for next frame only */ 80503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 80513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=1; /* flag for changing frame clipping for next frame */ 80523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 80533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) (0L)); /* temporary 0 delay */ 80543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=0; /* clipping boundaries delta type */ 80553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */ 80563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+19, 80575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.x + ping_width)); 80583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */ 80593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+27, 80605af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.y + ping_height)); 80613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,31,chunk); 80623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,31)); 80633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=4; 80643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 80653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 80663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 80673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 80683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 80693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng && !mng_info->need_fram && 80703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((int) image->dispose == 3)) 80713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(&image->exception,GetMagickModule(), 80723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Cannot convert GIF with disposal method 3 to MNG-LC", 80733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 80743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=save_image_depth; 80753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Save depth actually written */ 80773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp s[0]=(char) ping_bit_depth; 80793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s[1]='\0'; 80803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageProperty(image,"png:bit-depth-written",s); 80823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 80843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free PNG resources. 80853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 80865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 80873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 80883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_pixels=(unsigned char *) RelinquishMagickMemory(png_pixels); 80903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_SETJMP_NOT_THREAD_SAFE) 8092f84a193d5f435588cd78d521fff3f1f852e227f8cristy UnlockSemaphoreInfo(png_semaphore); 80933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 80943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 80953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 80963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 80973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOnePNGImage()"); 80983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 80993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* End write one PNG image */ 81003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 81013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 81023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 81033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 81043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e P N G I m a g e % 81083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 81113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 81123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WritePNGImage() writes a Portable Network Graphics (PNG) or 81143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file. 81153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 81173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WritePNGImage method is: 81193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) 81213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 81233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 81253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 81273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Returns MagickTrue on success, MagickFalse on failure. 81293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Communicating with the PNG encoder: 81313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% While the datastream written is always in PNG format and normally would 81333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be given the "png" file extension, this method also writes the following 81343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pseudo-formats which are subsets of PNG: 81353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG8: An 8-bit indexed PNG datastream is written. If transparency 81373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is present, the tRNS chunk must only have values 0 and 255 81383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (i.e., transparency is binary: fully opaque or fully 81393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparent). The pixels contain 8-bit indices even if 81403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% they could be represented with 1, 2, or 4 bits. Note: grayscale 81413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% images will be written as indexed PNG files even though the 81423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG grayscale type might be slightly more efficient. 81433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG24: An 8-bit per sample RGB PNG datastream is written. The tRNS 81453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk can be present to convey binary transparency by naming 81463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% one of the colors as transparent. 81473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG32: An 8-bit per sample RGBA PNG is written. Partial 81493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparency is permitted, i.e., the alpha sample for 81503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% each pixel can have any value from 0 to 255. The alpha 81513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% channel is present even if the image is fully opaque. 81523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o -define: For more precise control of the PNG output, you can use the 81543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image options "png:bit-depth" and "png:color-type". These 81553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% can be set from the commandline with "-define" and also 81563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% from the application programming interfaces. 81573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:color-type can be 0, 2, 3, 4, or 6. 81593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 0 (Grayscale), png:bit-depth can 81613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, 8, or 16. 81623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 2 (RGB), png:bit-depth can 81643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 8 or 16. 81653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 3 (Indexed), png:bit-depth can 81673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, or 8. This refers to the number of bits 81683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% used to store the index. The color samples always have 81693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% bit-depth 8 in indexed PNG files. 81703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 4 (Gray-Matte) or 6 (RGB-Matte), 81723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:bit-depth can be 8 or 16. 81733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% If the image cannot be written without loss in the requested PNG8, PNG24, 81753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% or PNG32 format or with the requested bit-depth and color-type without loss, 81763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% a PNG file will not be written, and the encoder will return MagickFalse. 81773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Since image encoders should not be responsible for the "heavy lifting", 81783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the user should make sure that ImageMagick has already reduced the 81793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image depth and number of colors and limit transparency to binary 81803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparency prior to attempting to write the image in a format that 81813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is subject to depth, color, or transparency limitations. 81823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% TODO: Enforce the previous paragraph. 81843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% TODO: Allow all other PNG subformats to be requested via new 81863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "-define png:bit-depth -define png:color-type" options. 81873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Note that another definition, "png:bit-depth-written" exists, but it 81893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is not intended for external use. It is only used internally by the 81903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG encoder to inform the JNG encoder of the depth of the alpha channel. 81913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It is possible to request that the PNG encoder write previously-formatted 81933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary chunks in the output PNG file, using the "-profile" commandline 81943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% option as shown below or by setting the profile via a programming 81953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% interface: 81963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% -profile PNG-chunk-x:<file> 81983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 81993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% where x is a location flag and <file> is a file containing the chunk 82003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% name in the first 4 bytes, then a colon (":"), followed by the chunk data. 82013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 82023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "x" can be "b" (before PLTE), "m" (middle, i.e., between PLTE and IDAT), 82033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% or "e" (end, i.e., after IDAT). If you want to write multiple chunks 82043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of the same type, then add a short unique string after the "x" to prevent 82053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% subsequent profiles from overwriting the preceding ones: 82063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 82073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% -profile PNG-chunk-x01:file01 -profile PNG-chunk-x02:file02 82083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 82093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 82103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 82113ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info, 82123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image *image) 82133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 82143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 82153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 82163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 82183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 82193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 82213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 82223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 82243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure; 82253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 82273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging; 82283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 82303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 82313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 82323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 82333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 82343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 82353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 82363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 82373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter WritePNGImage()"); 82383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); 82393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 82403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 82413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 82423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 82433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 82443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 824590823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(MngInfo)); 82463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 82473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 82483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 82493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 82503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 82513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 82523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 82533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 82543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* See if user has requested a specific PNG subformat */ 82563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 82583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 82593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 82603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8) 82623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 82639c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 3 */ 4; 82649c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 82659c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 82663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0 /* this does not work */ 82679c1eb0729653219b9da9037e044501a6dce79d10glennrp if (image->matte == MagickTrue) 82689c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,PaletteMatteType); 82699c1eb0729653219b9da9037e044501a6dce79d10glennrp else 82709c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,PaletteType); 82719c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SyncImage(image); 82723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 82733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 82743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png24) 82763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 82779c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 2 */ 3; 82789c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 82799c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 82809c1eb0729653219b9da9037e044501a6dce79d10glennrp if (image->matte == MagickTrue) 82819c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,TrueColorMatteType); 82829c1eb0729653219b9da9037e044501a6dce79d10glennrp else 82839c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,TrueColorType); 82849c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SyncImage(image); 82853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 82863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png32) 82883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 82899c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 6 */ 7; 82909c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 82919c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 82929c1eb0729653219b9da9037e044501a6dce79d10glennrp if (image->matte == MagickTrue) 82939c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,TrueColorMatteType); 82949c1eb0729653219b9da9037e044501a6dce79d10glennrp else 82959c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(image,TrueColorType); 82969c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SyncImage(image); 82973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 82983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 82993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageOption(image_info,"png:bit-depth"); 83003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 83013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 83023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"1") == 0) 83039c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 1; 83043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 83059c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 2; 83063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 83079c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 4; 83083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"8") == 0) 83099c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 83103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"16") == 0) 83119c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 16; 83123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 83139c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 83149c1eb0729653219b9da9037e044501a6dce79d10glennrp "png:bit-depth=%d was defined.\n",mng_info->write_png_depth); 83153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 83163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageOption(image_info,"png:color-type"); 83173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 83183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 83193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We must store colortype+1 because 0 is a valid colortype */ 83203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"0") == 0) 83219c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 1; 83223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 83239c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 3; 83243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"3") == 0) 83259c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 4; 83263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 83279c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 5; 83283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"6") == 0) 83299c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 7; 83303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 83319c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 83329c1eb0729653219b9da9037e044501a6dce79d10glennrp "png:color-type=%d was defined.\n",mng_info->write_png_colortype-1); 83333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 83343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=WriteOnePNGImage(mng_info,image_info,image); 83363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 83383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 83403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 83413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WritePNGImage()"); 83423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 83433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 83443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 83463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Write one JNG image */ 83483ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOneJNGImage(MngInfo *mng_info, 83493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info,Image *image) 83503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 83513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 83523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image; 83533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 83553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image_info; 83563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 83583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 83593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 83613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 83623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 83643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blob, 83653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[80], 83663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 83673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 83693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 83703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 83713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 83723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 83733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent; 83743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8375bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 83763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_quality; 83773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 83793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " enter WriteOneJNGImage()"); 83803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) NULL; 83823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=(Image *) NULL; 83833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) NULL; 83843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickTrue; 83863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent=image_info->type==GrayscaleMatteType || 83873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->type==TrueColorMatteType; 83883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=10; 83893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=0; 83903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_quality=image_info->quality == 0UL ? 75UL : image_info->quality; 83913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=0; 83923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 83933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 83943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 83953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* if any pixels are transparent */ 83963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent=MagickTrue; 83973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression==JPEGCompression) 83983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=8; 83993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 84003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 84023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 84033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=14; 84043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Create JPEG blob, image, and image_info */ 84053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 84063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 84073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image_info for opacity."); 84083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 84093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 84103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 84113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 84123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 84133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 84143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); 84153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 84163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 84173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 84183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SeparateImageChannel(jpeg_image,OpacityChannel); 84193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=NegateImage(jpeg_image,MagickFalse); 84203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->matte=MagickFalse; 84213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_quality >= 1000) 84223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->quality=jng_quality/1000; 84233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 84243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->quality=jng_quality; 84253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->type=GrayscaleType; 84263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SetImageType(jpeg_image,GrayscaleType); 84273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 84283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(jpeg_image_info->filename,MaxTextExtent, 84293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",jpeg_image->filename); 84303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 84313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: check bit depth of PNG alpha channel */ 84333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if image is grayscale. */ 84353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->type != TrueColorMatteType && image_info->type != 84363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy TrueColorType && ImageIsGray(image)) 84373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type-=2; 84383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 84403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 84413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 84423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 84433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 84443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 84453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode opacity as a grayscale PNG blob */ 84473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 84483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 84493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 84503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 84513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating PNG blob."); 84523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=0; 84533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"PNG",MaxTextExtent); 84553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"PNG",MaxTextExtent); 84563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 84573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, 84593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 84603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Retrieve sample depth used */ 84623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageProperty(jpeg_image,"png:bit-depth-written"); 84633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 84643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth= (unsigned int) value[0]; 84653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 84663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 84673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 84683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode opacity as a grayscale JPEG blob */ 84693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 84713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 84723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); 84743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 84753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 84763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 84773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 84783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 84793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, 8480f2faecf9facdbbb14fcba373365f9f691a9658e0cristy &image->exception); 84813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 84823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 84833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8484e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 8485e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 84863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 84883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Destroy JPEG image and image_info */ 84893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 84903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 84913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 84923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 84933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JHDR chunk */ 84953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,16L); /* chunk data length=16 */ 84963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JHDR); 84973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_JHDR,16L); 84984e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) image->columns); 84994e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) image->rows); 85003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=jng_color_type; 85013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[13]=8; /* sample depth */ 85023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=8; /*jng_image_compression_method */ 85033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[15]=(unsigned char) (image_info->interlace == NoInterlace ? 0 : 8); 85043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[16]=jng_alpha_sample_depth; 85053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[17]=jng_alpha_compression_method; 85063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[18]=0; /*jng_alpha_filter_method */ 85073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[19]=0; /*jng_alpha_interlace_method */ 85083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,20,chunk); 85093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); 85103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 85113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 85123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8513f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG width:%15lu",(unsigned long) image->columns); 85143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8515f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG height:%14lu",(unsigned long) image->rows); 85163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG color type:%10d",jng_color_type); 85183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG sample depth:%8d",8); 85203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG compression:%9d",8); 85223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG interlace:%11d",0); 85243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha depth:%9d",jng_alpha_sample_depth); 85263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha compression:%3d",jng_alpha_compression_method); 85283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha filter:%8d",0); 85303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha interlace:%5d",0); 85323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 85333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write any JNG-chunk-b profiles */ 85353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_write_chunk_from_profile(image,"JNG-chunk-b",(int) logging); 85363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 85383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write leading ancillary chunks 85393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 85403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 85423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 85433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 85443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG bKGD chunk 85453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 85463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 85483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue, 85493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 85503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red; 85513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8552bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 85533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes; 85543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 85563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=6L; 85573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 85583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=10L; 8559bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) (num_bytes-4L)); 85603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 8561bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy LogPNGChunk((int) logging,mng_bKGD,(size_t) (num_bytes-4L)); 85623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToChar(image->background_color.red); 85633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToChar(image->background_color.green); 85643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToChar(image->background_color.blue); 85653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+4)=0; 85663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+5)=red; 85673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+6)=0; 85683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+7)=green; 85693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+8)=0; 85703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+9)=blue; 85713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) num_bytes,chunk); 85723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) num_bytes)); 85733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 85743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 85753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent)) 85763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 85773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 85783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG sRGB chunk 85793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 85803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 85813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 85823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_sRGB,1L); 85833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 8584e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 8585e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 8586e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 85873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 8588e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 8589e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 8590e610a071534e448c46460a5aa39ede33bf56b329glennrp (PerceptualIntent)); 85913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 85923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 85933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 85943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 85953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 85963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma != 0.0) 85973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 85983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 85993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG gAMA chunk 86003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 86013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 86023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 86033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_gAMA,4L); 860435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 86053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 86063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 86073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->equal_chrms == MagickFalse) && 86093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->chromaticity.red_primary.x != 0.0)) 86103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 86113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 86123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 86133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 86143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 86153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG cHRM chunk 86163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 86173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 86183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 86193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_cHRM,32L); 86203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 862135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 862235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 86233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 862435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 862535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 86263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 862735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 862835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 86293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 863035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 863135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 86323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 86333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 86343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->x_resolution && image->y_resolution && !mng_info->equal_physs) 86373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 86383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 86393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG pHYs chunk 86403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 86413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 86423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 86433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_pHYs,9L); 86443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 86453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 864635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 86473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->x_resolution*100.0/2.54+0.5)); 864835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 86493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->y_resolution*100.0/2.54+0.5)); 86503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 86513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 86533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 86543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 86553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 865635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 86573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->x_resolution*100.0+0.5)); 865835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 86593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->y_resolution*100.0+0.5)); 86603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 86613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 86633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 866435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (image->x_resolution+0.5)); 866535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (image->y_resolution+0.5)); 86663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 86673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 86703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 86713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 86733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.x || image->page.y)) 86743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 86753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 86763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG oFFs chunk 86773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 86783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 86793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_oFFs); 86803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_oFFs,9L); 8681bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+4,(ssize_t) (image->page.x)); 8682bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+8,(ssize_t) (image->page.y)); 86833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 86843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 86853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 86863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.width || image->page.height)) 86883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 86893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 86903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_vpAg); 86913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_vpAg,9L); 86923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+4,(png_uint_32) image->page.width); 86933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) image->page.height); 86943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; /* unit = pixels */ 86953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 86963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 86973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 86983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 86993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 87013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 87023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 87033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 8704bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 87053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 87063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8707bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 87083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len; 87093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IDAT chunk header */ 87113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8713e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write IDAT chunks from blob, length=%.20g.",(double) 8714f2faecf9facdbbb14fcba373365f9f691a9658e0cristy length); 87153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Copy IDAT chunks */ 87173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=0; 87183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=blob+8; 8719bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=8; i<(ssize_t) length; i+=len+12) 87203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 87213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=(*p<<24)|((*(p+1))<<16)|((*(p+2))<<8)|(*(p+3)); 87223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 87233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*(p)==73 && *(p+1)==68 && *(p+2)==65 && *(p+3)==84) /* IDAT */ 87243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 87253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Found an IDAT chunk. */ 8726bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) len); 8727bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy LogPNGChunk((int) logging,mng_IDAT,(size_t) len); 87283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) len+4,p); 87293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image, 87303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(0,p,(uInt) len+4)); 87313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 87333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 87343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8736e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping %c%c%c%c chunk, length=%.20g.", 8737e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy *(p),*(p+1),*(p+2),*(p+3),(double) len); 87383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=(8+len); 87403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 87433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 87443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAA chunk header */ 87453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8747e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAA chunk, length=%.20g.",(double) length); 8748bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 87493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAA); 87503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_JDAA,length); 87513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) data */ 87523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 87533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 87543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob, 87553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) length)); 87563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 87583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 87593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode image as a JPEG blob */ 87613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 87633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image_info."); 87643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 87653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 87663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 87673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 87703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 87713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=CloneImage(image,0,0,MagickTrue,&image->exception); 87733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 87743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 87753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 87763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 87783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) FormatMagickString(jpeg_image_info->filename,MaxTextExtent,"%s", 87793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->filename); 87803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 87823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->exception); 87833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8786e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Created jpeg_image, %.20g x %.20g.",(double) jpeg_image->columns, 8787e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) jpeg_image->rows); 87883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 87893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 87903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->type=GrayscaleType; 87913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->quality=jng_quality % 1000; 87923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); 87933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 87943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 87963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 87973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length,&image->exception); 87983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 87993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 88003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8801e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 8802e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 88033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8805e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAT chunk, length=%.20g.",(double) length); 88063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 88073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) */ 8808bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 88093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAT); 88103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_JDAT,length); 88113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 88123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 88133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob,(uInt) length)); 88143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 88163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 88173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 88183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 88193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write any JNG-chunk-e profiles */ 88213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_write_chunk_from_profile(image,"JNG-chunk-e",(int) logging); 88223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IEND chunk */ 88243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0L); 88253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_IEND); 88263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_IEND,0); 88273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 88283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 88293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 88313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 88323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOneJNGImage()"); 88333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 88343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 88353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 88383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 88393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e J N G I m a g e % 88433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 88463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 88473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteJNGImage() writes a JPEG Network Graphics (JNG) image file. 88493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 88513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteJNGImage method is: 88533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image) 88553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 88573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 88593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 88613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 88623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 88633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 88643ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image) 88653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 88663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 88673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 88683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 88703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 88713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 88733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure; 88743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 88763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging; 88773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 88793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 88803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 88813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 88823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 88833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 88843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 88853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 88863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter WriteJNGImage()"); 88873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); 88883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 88893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 88903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 88913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 88923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 88933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 88943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 889590823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(MngInfo)); 88963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 88973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 88983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 88993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 89003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 89023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 89033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 89043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\213JNG\r\n\032\n"); 89063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=WriteOneJNGImage(mng_info,image_info,image); 89083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 89093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 89113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 89123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 89133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteJNGImage()"); 89143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 89153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 89163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 89173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89203ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 89213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 89223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 89233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *option; 89243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 89263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image; 89273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 89293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 89303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 89323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 89333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 89353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure, 89363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count, 89373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations, 89383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte; 89393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 89413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 89423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 89433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte, 89443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 89453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray, 89463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging, 89473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi, 89483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy optimize, 89493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte; 89503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8951bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 89523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 89533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 89553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[800]; 89563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 89583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng, 89593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng; 89603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8961bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 89623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 89633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8964bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 89653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=0, 89663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay; 89673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8968d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER < 10200) 89693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 89703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 89713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 89723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 89733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 89753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 89763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 89783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 89793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 89803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 89813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 89823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(),"enter WriteMNGImage()"); 89833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,&image->exception); 89843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 89853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 89863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 89883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 89893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 899190823213d62b0ba18557e61f1e6892c6fffd6cd4cristy mng_info=(MngInfo *) AcquireAlignedMemory(1,sizeof(MngInfo)); 89923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 89933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 89943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 89953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 89963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 89983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 89993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 90003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng=LocaleCompare(image_info->magick,"MNG") == 0; 90013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 90033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See if user has requested a specific PNG subformat to be used 90043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * for all of the PNGs in the MNG being written, e.g., 90053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 90063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * convert *.png png8:animation.mng 90073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 90083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * To do: check -define png:bit_depth and png:color_type as well, 90093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * or perhaps use mng:bit_depth and mng:color_type instead for 90103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * global settings. 90113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 90123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 90143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 90153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 90163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickFalse; 90183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 90193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickTrue; 90203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->adjoin=image_info->adjoin && 90223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && write_mng; 90233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) 90253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy optimize=MagickFalse; 90263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy optimize=(image_info->type == OptimizeType || image_info->type == 90283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy UndefinedType); 90293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 90313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Log some info about the input */ 90333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 90343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 90353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Checking input image(s)"); 90383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (optimize) 90393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Optimize: TRUE"); 90413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Optimize: FALSE"); 90443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9045e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image_info depth: %.20g",(double) image_info->depth); 90463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Type: %d",image_info->type); 90483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 90503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 90513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9053e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Scene: %.20g",(double) scene++); 90543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9055e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image depth: %.20g",(double) p->depth); 90563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->matte) 90573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: True"); 90593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: False"); 90623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->storage_class == PseudoClass) 90633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: PseudoClass"); 90653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: DirectClass"); 90683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->colors) 90693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9070e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Number of colors: %.20g",(double) p->colors); 90713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Number of colors: unspecified"); 90743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 90753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 90763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 90773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 90783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 90803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Sometimes we get PseudoClass images whose RGB values don't match 90813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the colors in the colormap. This code syncs the RGB values. 90823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 90833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 90853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 90863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 90883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->taint && p->storage_class == PseudoClass) 90903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) SyncImage(p); 90913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 90923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 90933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 90943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 90953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_BUILD_PALETTE 90973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (optimize) 90983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 91003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Sometimes we get DirectClass images that have 256 colors or fewer. 91013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This code will convert them to PseudoClass and build a colormap. 91023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 91033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 91043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 91053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 91073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->storage_class != PseudoClass) 91093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p->colors=GetNumberColors(p,(FILE *) NULL,&p->exception); 91113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->colors <= 256) 91123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p->colors=0; 91143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->matte != MagickFalse) 91159c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(p,PaletteMatteType); 91163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 91179c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) SetImageType(p,PaletteType); 91183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 91213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 91223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 91253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 91273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 91283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 91293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 91303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 91313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickFalse; 91323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickFalse; 91333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 91343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=1; 91353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 91373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->page != (char *) NULL) 91383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 91403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine image bounding box. 91413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 91423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetGeometry(image,&mng_info->page); 91433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseMetaGeometry(image_info->page,&mng_info->page.x, 91443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &mng_info->page.y,&mng_info->page.width,&mng_info->page.height); 91453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 91473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 91493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom; 91503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 91523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red, 91533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 91543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue; 91553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 91573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickTrue; 91583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.width || mng_info->page.height) 91593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickFalse; 91603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 91613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Check all the scenes. 91623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 91633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay=image->delay; 91643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 91653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=image->chromaticity.red_primary.x != 0.0; 91663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickTrue, 91673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickTrue; 91683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickTrue; 91693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickTrue; 91703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 91713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 91723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 91733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickTrue; 91743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 91753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickFalse; 91763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 91773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next_image=image; next_image != (Image *) NULL; ) 91783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_geom) 91803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->columns+next_image->page.x) > mng_info->page.width) 91823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.width=next_image->columns+next_image->page.x; 91833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->rows+next_image->page.y) > mng_info->page.height) 91843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.height=next_image->rows+next_image->page.y; 91853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 91863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->page.x || next_image->page.y) 91873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickTrue; 91883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->matte) 91893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickTrue; 91903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) next_image->dispose >= BackgroundDispose) 91913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->matte || next_image->page.x || next_image->page.y || 91923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((next_image->columns < mng_info->page.width) && 91933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->rows < mng_info->page.height))) 91943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 91953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->iterations) 91963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickTrue; 91973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=next_image->delay; 91983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != initial_delay || final_delay > 1UL* 91993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->ticks_per_second) 92003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=1; 92013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 92023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 92033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 92043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check for global palette possibility. 92053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 92063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 92073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 92083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte == 0) 92093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ImageIsGray(image) == MagickFalse) 92113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 92123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,next_image); 92133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (use_global_plte == 0) 92143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=mng_info->equal_palettes; 92153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=!mng_info->equal_palettes; 92163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 92183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(next_image) != (Image *) NULL) 92193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->background_color.red != 92213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.red || 92223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.green != 92233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.green || 92243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.blue != 92253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.blue) 92263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 92273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->gamma != next_image->next->gamma) 92283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 92293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->rendering_intent != 92303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->rendering_intent) 92313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 92323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->units != next_image->next->units) || 92333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->x_resolution != next_image->next->x_resolution) || 92343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->y_resolution != next_image->next->y_resolution)) 92353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 92363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 92373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->chromaticity.red_primary.x != 92393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.x || 92403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.red_primary.y != 92413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.y || 92423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.x != 92433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.x || 92443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.y != 92453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.y || 92463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.x != 92473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.x || 92483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.y != 92493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.y || 92503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.x != 92513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.x || 92523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.y != 92533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.y) 92543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 92553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 92583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next_image); 92593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count < 2) 92613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 92633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 92643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 92653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 92663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 92673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 92683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 92693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 92703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 92713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 92723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram == MagickFalse) 92743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 92763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Only certain framing rates 100/n are exactly representable without 92773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the FRAM chunk but we'll allow some slop in VLC files 92783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 92793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay == 0) 92803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_iterations != MagickFalse) 92823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 92843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy It's probably a GIF with loop; don't run it *too* fast. 92853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 92860261712cdc8fb4765add50146936e3ba2cb9fefaglennrp if (mng_info->adjoin) 9287d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp { 9288d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp final_delay=10; 9289d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp (void) ThrowMagickException(&image->exception, 9290d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp GetMagickModule(),CoderWarning, 9291d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp "input has zero delay between all frames; assuming", 9292d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp " 10 cs `%s'",""); 9293d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp } 92943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 92963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=0; 92973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != 0) 92994e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy mng_info->ticks_per_second=(png_uint_32) (image->ticks_per_second/final_delay); 93003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 50) 93013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=2; 93023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 75) 93033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1; 93043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 125) 93053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 93063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi && final_delay > 2 && (final_delay != 4) && 93073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 5) && (final_delay != 10) && (final_delay != 20) && 93083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 25) && (final_delay != 50) && (final_delay != 93093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1UL*image->ticks_per_second)) 93103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; /* make it exact; cannot be VLC */ 93113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram != MagickFalse) 93133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 93143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If pseudocolor, we should also check to see if all the 93163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palettes are identical and write a global PLTE if they are. 93173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ../glennrp Feb 99. 93183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MNG version 1.0 signature and MHDR chunk. 93213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\212MNG\r\n\032\n"); 93233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,28L); /* chunk data length=28 */ 93243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MHDR); 93253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_MHDR,28L); 93264e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) mng_info->page.width); 93274e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.height); 93283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,mng_info->ticks_per_second); 93293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+16,0L); /* layer count=unknown */ 93303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+20,0L); /* frame count=unknown */ 93313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+24,0L); /* play time=unknown */ 93323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_jng) 93333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 93353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 93373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,27L); /* simplicity=LC+JNG */ 93383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,25L); /* simplicity=VLC+JNG */ 93403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 93443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,19L); /* simplicity=LC+JNG, no transparency */ 93453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,17L); /* simplicity=VLC+JNG, no transparency */ 93473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 93543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,11L); /* simplicity=LC */ 93553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,9L); /* simplicity=VLC */ 93573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 93613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,3L); /* simplicity=LC, no transparency */ 93623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 93633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,1L); /* simplicity=VLC, no transparency */ 93643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,32,chunk); 93673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,32)); 93683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy option=GetImageOption(image_info,"mng:need-cacheoff"); 93693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (option != (const char *) NULL) 93703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 93723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 93733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 93743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write "nEED CACHEOFF" to turn playback caching off for streaming MNG. 93763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_nEED); 93783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=CopyMagickString((char *) chunk+4,"CACHEOFF",20); 9379bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 9380bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy LogPNGChunk((int) logging,mng_nEED,(size_t) length); 93813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length+=4; 93823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,chunk); 93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) length)); 93843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((GetPreviousImageInList(image) == (Image *) NULL) && 93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && 93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->iterations != 1)) 93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG TERM chunk 93913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 93933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_TERM); 93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_TERM,10L); 93953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=3; /* repeat animation */ 93963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* show last frame when done */ 93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+6,(png_uint_32) (mng_info->ticks_per_second* 93983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/MagickMax(image->ticks_per_second,1))); 93993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,PNG_UINT_31_MAX); 94013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 94023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) image->iterations); 94033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 94043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9406e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM delay: %.20g",(double) (mng_info->ticks_per_second* 9407e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy final_delay/MagickMax(image->ticks_per_second,1))); 94083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 94093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9410e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM iterations: %.20g",(double) PNG_UINT_31_MAX); 94113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 94123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9413e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image iterations: %.20g",(double) image->iterations); 94143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 94163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 94173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 94203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent) && 94223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs) 94233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG sRGB chunk 94263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 94283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 94293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_sRGB,1L); 94303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 9431e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 9432e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 9433e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 94343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 9435e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 9436e610a071534e448c46460a5aa39ede33bf56b329glennrp PNG_RenderingIntent_from_Magick_RenderingIntent( 9437e610a071534e448c46460a5aa39ede33bf56b329glennrp (PerceptualIntent)); 94383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 94393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 94403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_srgb=MagickTrue; 94413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 94433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma && mng_info->equal_gammas) 94453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG gAMA chunk 94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 94503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 94513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_gAMA,4L); 945235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 94533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 94543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 94553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_gama=MagickTrue; 94563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 94583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 94613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 94623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG cHRM chunk 94643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 94663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 94673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_cHRM,32L); 94683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 946935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 947035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 94713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 947235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 947335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 94743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 947535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 947635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 94773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 947835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 947935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 94803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 94813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_chrm=MagickTrue; 94833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->x_resolution && image->y_resolution && mng_info->equal_physs) 94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG pHYs chunk 94893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 94913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_pHYs,9L); 94933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 94943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 949535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 94963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->x_resolution*100.0/2.54+0.5)); 949735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 94983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->y_resolution*100.0/2.54+0.5)); 94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 95003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 95023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 95043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 950535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 95063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->x_resolution*100.0+0.5)); 950735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 95083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->y_resolution*100.0+0.5)); 95093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 95103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 95123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 951335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (image->x_resolution+0.5)); 951435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (image->y_resolution+0.5)); 95153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 95163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 95193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 95223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG BACK chunk and global bKGD chunk, if the image is transparent 95233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy or does not cover the entire frame. 95243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 95253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng && (image->matte || image->page.x > 0 || 95263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y > 0 || (image->page.width && 95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->page.width+image->page.x < mng_info->page.width)) 95283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy || (image->page.height && (image->page.height+image->page.y 95293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy < mng_info->page.height)))) 95303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 95323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_BACK); 95333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_BACK,6L); 95343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToShort(image->background_color.red); 95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToShort(image->background_color.green); 95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToShort(image->background_color.blue); 95373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+4,red); 95383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+6,green); 95393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+8,blue); 95403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 95413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 95423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_backgrounds) 95433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 95453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 95463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_bKGD,6L); 95473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 95483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 95493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 95533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((need_local_plte == MagickFalse) && 95543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class == PseudoClass) && 95553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (all_images_are_gray == MagickFalse)) 95563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9557bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 95583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 95593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 95613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 95623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 95633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 95643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 95653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 95663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_PLTE,data_length); 9567bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 95683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red) & 0xff; 95703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green) & 0xff; 95713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue) & 0xff; 95723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 95743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) (data_length+4))); 95753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 95763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 95783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 95803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->delay=0; 95813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 95823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 95833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 95843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 95853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin) 95883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 95903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 95913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 95923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If we aren't using a global palette for the entire MNG, check to 95933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy see if we can use one for two or more consecutive images. 95943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 95953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte && use_global_plte && !all_images_are_gray) 95963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy When equal_palettes is true, this image has the same palette 96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy as the previous PseudoClass image 96023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=mng_info->equal_palettes; 96043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,image->next); 96053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_palettes && !mng_info->have_write_global_plte) 96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 96093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 9610bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 96113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 96123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 96143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 96153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 96163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_PLTE,data_length); 9617bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 96183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red); 96203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green); 96213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue); 96223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 96243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk, 96253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) (data_length+4))); 96263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 96273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickFalse; 96313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 96333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi) 96343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9635bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 96363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x, 96373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y; 96383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scene) 96403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=mng_info->page.x; 96423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=mng_info->page.y; 96433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=0; 96473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=0; 96483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 96503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->page.x != previous_x) || 96513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->page.y != previous_y)) 96523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,12L); /* data length=12 */ 96543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_DEFI); 96553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_DEFI,12L); 96563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=0; /* object 0 MSB */ 96573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* object 0 LSB */ 96583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=0; /* visible */ 96593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* abstract */ 96603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.x); 96613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,(png_uint_32) mng_info->page.y); 96623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,16,chunk); 96633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,16)); 96643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_mng=write_mng; 96693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) image->dispose >= 3) 96713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 96723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && mng_info->adjoin && 96743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->delay != mng_info->delay) || 96753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->framing_mode != mng_info->old_framing_mode))) 96763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay == mng_info->delay) 96783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the new framing mode. 96813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 96823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); /* data length=1 */ 96833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 96843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_FRAM,1L); 96853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 96863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 96873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 96883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the delay. 96933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 96943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 96963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_FRAM,10L); 96973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 96983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 96993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=2; /* flag for changing default delay */ 97003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 97013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=0; /* flag for changing frame clipping */ 97023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 97033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) 97043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((mng_info->ticks_per_second* 97053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay)/MagickMax(image->ticks_per_second,1))); 97063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 97073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 97084e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy mng_info->delay=(png_uint_32) image->delay; 97093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=mng_info->framing_mode; 97113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 97143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 97153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 97173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_info; 97183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing JNG object."); 97223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: specify the desired alpha compression method. */ 97233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=CloneImageInfo(image_info); 97243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info->compression=UndefinedCompression; 97253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=WriteOneJNGImage(mng_info,write_info,image); 97263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=DestroyImageInfo(write_info); 97273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 97293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 97303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG object."); 97343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=WriteOnePNGImage(mng_info,image_info,image); 97353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 97383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 97403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 97413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 97423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 97443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 97453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 97463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 97473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,SaveImagesTag,scene++, 97483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(image)); 97493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 97503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 97513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (mng_info->adjoin); 97523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 97533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 97553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 97563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 97573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MEND chunk. 97583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 97593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0x00000000L); 97603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MEND); 97613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy LogPNGChunk((int) logging,mng_MEND,0L); 97623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 97633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 97643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 97663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 97673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 97683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 97693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 97703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()"); 97723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 97733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 9774d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#else /* PNG_LIBPNG_VER > 10011 */ 97753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) 97763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 97773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=image; 97783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 97793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 97803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(CoderError,"PNG library is too old", 97813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 97823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 97833ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 97843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 97853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(WritePNGImage(image_info,image)); 97863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 9787d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 97883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9789