png.c revision 25024a6b81adca7509dfd90b03c27dbb42c5889b
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% % 211454be7db7a897f42cd40e4165f945d77196a6f8cristy% Copyright 1999-2012 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*/ 4416ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/studio.h" 4516ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/artifact.h" 4616ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/attribute.h" 4716ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/blob.h" 4816ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/blob-private.h" 4916ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/cache.h" 50aa2c16cb5e695053aa78e40f66bc36fbef4b1ed1cristy#include "MagickCore/channel.h" 5116ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/color.h" 5216ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/color-private.h" 5316ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/colormap.h" 5416ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/colorspace.h" 5516ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/colorspace-private.h" 5616ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/constitute.h" 5716ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/enhance.h" 5816ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/exception.h" 5916ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/exception-private.h" 6016ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/geometry.h" 6116ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/histogram.h" 6216ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/image.h" 6316ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/image-private.h" 6416ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/layer.h" 6516ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/list.h" 6616ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/log.h" 6716ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/MagickCore.h" 6816ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/memory_.h" 6916ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/module.h" 7016ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/monitor.h" 7116ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/monitor-private.h" 7216ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/option.h" 7316ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/pixel.h" 7416ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/pixel-accessor.h" 7516ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/profile.h" 7616ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/property.h" 7716ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/quantum-private.h" 7816ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/resource_.h" 7916ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/semaphore.h" 8016ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/quantum-private.h" 8116ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/static.h" 8216ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/statistic.h" 8316ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/string_.h" 8416ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/string-private.h" 8516ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/transform.h" 8616ea139d53d867211d3bb0fa859a83de653f687ecristy#include "MagickCore/utility.h" 873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 88286a6355c4544b794da2b6df973faad07c69e541glennrp 897ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp/* Suppress libpng pedantic warnings that were added in 907ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp * libpng-1.2.41 and libpng-1.4.0. If you are working on 91faa852bad40107edae19405e76a299057668d795glennrp * migration to libpng-1.5, remove these defines and then 927ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp * fix any code that generates warnings. 937ef138c2e0e2bd4acefd810968b0324f6dc469f1glennrp */ 94991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp/* #define PNG_DEPRECATED Use of this function is deprecated */ 95faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_USE_RESULT The result of this function must be checked */ 96faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_NORETURN This function does not return */ 97faa852bad40107edae19405e76a299057668d795glennrp/* #define PNG_ALLOCATED The result of the function is new memory */ 988371ecc013ff231ce380d8717e517312e62e1f01glennrp/* #define PNG_DEPSTRUCT Access to this struct member is deprecated */ 995b927348e949d94f3a64b055eccb03459f115c69glennrp 1005b927348e949d94f3a64b055eccb03459f115c69glennrp/* PNG_PTR_NORETURN does not work on some platforms, in libpng-1.5.x */ 10175cfe702843fd25dba7cb241c05fa65957c67129cristy#define PNG_PTR_NORETURN 102286a6355c4544b794da2b6df973faad07c69e541glennrp 1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "png.h" 1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#include "zlib.h" 1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* ImageMagick differences */ 1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define first_scene scene 1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 109d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Optional declarations. Define or undefine them as you like. 1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* #define PNG_DEBUG -- turning this on breaks VisualC compiling */ 1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Features under construction. Define these to work on them. 1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_OBJECT_BUFFERS 1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_BASI_SUPPORTED 1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_COALESCE_LAYERS /* In 5.4.4, this interfered with MMAP'ed files. */ 1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_INSERT_LAYERS /* Troublesome, but seem to work as of 5.4.4 */ 1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_JPEG_DELEGATE) 1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define JNG_SUPPORTED /* Not finished as of 5.5.2. See "To do" comments. */ 1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(RGBColorMatchExact) 1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define IsPNGColorEqual(color,target) \ 1278e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp (((color).red == (target).red) && \ 1288e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp ((color).green == (target).green) && \ 1298e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp ((color).blue == (target).blue)) 1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1328e58efdecda887b08ef730d68290a61081ef2566glennrp/* Macros for left-bit-replication to ensure that pixels 13316ea139d53d867211d3bb0fa859a83de653f687ecristy * and PixelInfos all have the same image->depth, and for use 1348e58efdecda887b08ef730d68290a61081ef2566glennrp * in PNG8 quantization. 1358e58efdecda887b08ef730d68290a61081ef2566glennrp */ 1368e58efdecda887b08ef730d68290a61081ef2566glennrp 1378e58efdecda887b08ef730d68290a61081ef2566glennrp 1388e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR01: Replicate top bit */ 1398e58efdecda887b08ef730d68290a61081ef2566glennrp 14005001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR01PacketRed(pixelpacket) \ 1418e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=(ScaleQuantumToChar((pixelpacket).red) < 0x10 ? \ 1428e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1438e58efdecda887b08ef730d68290a61081ef2566glennrp 14491d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketGreen(pixelpacket) \ 1458e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=(ScaleQuantumToChar((pixelpacket).green) < 0x10 ? \ 1468e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1478e58efdecda887b08ef730d68290a61081ef2566glennrp 14891d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketBlue(pixelpacket) \ 1498e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=(ScaleQuantumToChar((pixelpacket).blue) < 0x10 ? \ 1508e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1518e58efdecda887b08ef730d68290a61081ef2566glennrp 15216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PacketAlpha(pixelpacket) \ 15316ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=(ScaleQuantumToChar((pixelpacket).alpha) < 0x10 ? \ 1548e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1558e58efdecda887b08ef730d68290a61081ef2566glennrp 15691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketRGB(pixelpacket) \ 157bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 15805001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR01PacketRed((pixelpacket)); \ 15991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketGreen((pixelpacket)); \ 16091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketBlue((pixelpacket)); \ 161bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 1628e58efdecda887b08ef730d68290a61081ef2566glennrp 16391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketRGBO(pixelpacket) \ 164bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 16591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGB((pixelpacket)); \ 16616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PacketAlpha((pixelpacket)); \ 167bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 1688e58efdecda887b08ef730d68290a61081ef2566glennrp 169ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR01PixelRed(pixel) \ 17016ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToChar(GetPixelRed(image,(pixel))) < 0x10 ? \ 1718e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1728e58efdecda887b08ef730d68290a61081ef2566glennrp 17354cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelGreen(pixel) \ 17416ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToChar(GetPixelGreen(image,(pixel))) < 0x10 ? \ 1758e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1768e58efdecda887b08ef730d68290a61081ef2566glennrp 17754cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelBlue(pixel) \ 17816ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToChar(GetPixelBlue(image,(pixel))) < 0x10 ? \ 1798e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1808e58efdecda887b08ef730d68290a61081ef2566glennrp 18116ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PixelAlpha(pixel) \ 18216ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) < 0x10 ? \ 1838e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1848e58efdecda887b08ef730d68290a61081ef2566glennrp 18554cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelRGB(pixel) \ 186bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 187ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR01PixelRed((pixel)); \ 18854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelGreen((pixel)); \ 18954cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelBlue((pixel)); \ 190bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 1918e58efdecda887b08ef730d68290a61081ef2566glennrp 19216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PixelRGBA(pixel) \ 193bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 19454cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelRGB((pixel)); \ 19516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PixelAlpha((pixel)); \ 196bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 1978e58efdecda887b08ef730d68290a61081ef2566glennrp 1988e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR02: Replicate top 2 bits */ 1998e58efdecda887b08ef730d68290a61081ef2566glennrp 20005001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR02PacketRed(pixelpacket) \ 2018e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2028e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xc0; \ 2038e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum( \ 2048e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2058e58efdecda887b08ef730d68290a61081ef2566glennrp } 20691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketGreen(pixelpacket) \ 2078e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2088e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xc0; \ 2098e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum( \ 2108e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2118e58efdecda887b08ef730d68290a61081ef2566glennrp } 21291d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketBlue(pixelpacket) \ 2138e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2148e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xc0; \ 2158e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum( \ 2168e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2178e58efdecda887b08ef730d68290a61081ef2566glennrp } 21816ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PacketAlpha(pixelpacket) \ 2198e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 22016ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).alpha) & 0xc0; \ 22116ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleCharToQuantum( \ 2228e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2238e58efdecda887b08ef730d68290a61081ef2566glennrp } 2248e58efdecda887b08ef730d68290a61081ef2566glennrp 22591d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketRGB(pixelpacket) \ 226bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 22705001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR02PacketRed((pixelpacket)); \ 22891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketGreen((pixelpacket)); \ 22991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue((pixelpacket)); \ 230bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2318e58efdecda887b08ef730d68290a61081ef2566glennrp 23291d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketRGBO(pixelpacket) \ 233bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 23491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGB((pixelpacket)); \ 23516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PacketAlpha((pixelpacket)); \ 236bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2378e58efdecda887b08ef730d68290a61081ef2566glennrp 238ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR02PixelRed(pixel) \ 2398e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 24016ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 2418e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xc0; \ 24216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image, ScaleCharToQuantum( \ 24316ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 24416ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 2458e58efdecda887b08ef730d68290a61081ef2566glennrp } 24654cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelGreen(pixel) \ 2478e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 24816ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 2498e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xc0; \ 25016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image, ScaleCharToQuantum( \ 25116ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 25216ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 2538e58efdecda887b08ef730d68290a61081ef2566glennrp } 25454cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelBlue(pixel) \ 2558e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2568e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 25716ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,(pixel))) & 0xc0; \ 25816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image, ScaleCharToQuantum( \ 25916ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 26016ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 2618e58efdecda887b08ef730d68290a61081ef2566glennrp } 26216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PixelAlpha(pixel) \ 2638e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2648e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 26516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) & 0xc0; \ 26616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, ScaleCharToQuantum( \ 26716ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 26816ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel) ); \ 2698e58efdecda887b08ef730d68290a61081ef2566glennrp } 2708e58efdecda887b08ef730d68290a61081ef2566glennrp 27154cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelRGB(pixel) \ 272bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 273ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR02PixelRed((pixel)); \ 27454cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelGreen((pixel)); \ 27554cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelBlue((pixel)); \ 276bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2778e58efdecda887b08ef730d68290a61081ef2566glennrp 27816ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PixelRGBA(pixel) \ 279bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 28054cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelRGB((pixel)); \ 28116ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PixelAlpha((pixel)); \ 282bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2838e58efdecda887b08ef730d68290a61081ef2566glennrp 2848e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR03: Replicate top 3 bits (only used with opaque pixels during 2858e58efdecda887b08ef730d68290a61081ef2566glennrp PNG8 quantization) */ 2868e58efdecda887b08ef730d68290a61081ef2566glennrp 28705001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR03PacketRed(pixelpacket) \ 2888e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2898e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xe0; \ 2908e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum( \ 2918e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 2928e58efdecda887b08ef730d68290a61081ef2566glennrp } 29391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketGreen(pixelpacket) \ 2948e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2958e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xe0; \ 2968e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum( \ 2978e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 2988e58efdecda887b08ef730d68290a61081ef2566glennrp } 29991d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketBlue(pixelpacket) \ 3008e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3018e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xe0; \ 3028e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum( \ 3038e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 3048e58efdecda887b08ef730d68290a61081ef2566glennrp } 3058e58efdecda887b08ef730d68290a61081ef2566glennrp 30691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketRGB(pixelpacket) \ 307bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 30805001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR03PacketRed((pixelpacket)); \ 30991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketGreen((pixelpacket)); \ 31091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketBlue((pixelpacket)); \ 311bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3128e58efdecda887b08ef730d68290a61081ef2566glennrp 313ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR03PixelRed(pixel) \ 3148e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 31516ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 3168e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 31716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image, ScaleCharToQuantum( \ 31816ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3198e58efdecda887b08ef730d68290a61081ef2566glennrp } 32016ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03Green(pixel) \ 3218e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 32216ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 3238e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 32416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image, ScaleCharToQuantum( \ 32516ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3268e58efdecda887b08ef730d68290a61081ef2566glennrp } 32716ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03Blue(pixel) \ 3288e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 32916ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelBlue(image,(pixel))) \ 3308e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 33116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image, ScaleCharToQuantum( \ 33216ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3338e58efdecda887b08ef730d68290a61081ef2566glennrp } 3348e58efdecda887b08ef730d68290a61081ef2566glennrp 33516ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03RGB(pixel) \ 336bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 337ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR03PixelRed((pixel)); \ 33816ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03Green((pixel)); \ 33916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03Blue((pixel)); \ 340bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3418e58efdecda887b08ef730d68290a61081ef2566glennrp 3428e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR04: Replicate top 4 bits */ 3438e58efdecda887b08ef730d68290a61081ef2566glennrp 34405001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR04PacketRed(pixelpacket) \ 3458e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3468e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xf0; \ 3478e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3488e58efdecda887b08ef730d68290a61081ef2566glennrp } 34991d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketGreen(pixelpacket) \ 3508e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3518e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xf0; \ 3528e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3538e58efdecda887b08ef730d68290a61081ef2566glennrp } 35491d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketBlue(pixelpacket) \ 3558e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3568e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xf0; \ 3578e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3588e58efdecda887b08ef730d68290a61081ef2566glennrp } 35916ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PacketAlpha(pixelpacket) \ 3608e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 36116ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).alpha) & 0xf0; \ 36216ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3638e58efdecda887b08ef730d68290a61081ef2566glennrp } 3648e58efdecda887b08ef730d68290a61081ef2566glennrp 36591d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketRGB(pixelpacket) \ 366bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 36705001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR04PacketRed((pixelpacket)); \ 36891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketGreen((pixelpacket)); \ 36991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketBlue((pixelpacket)); \ 370bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3718e58efdecda887b08ef730d68290a61081ef2566glennrp 37291d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketRGBO(pixelpacket) \ 373bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 37491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB((pixelpacket)); \ 37516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PacketAlpha((pixelpacket)); \ 376bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3778e58efdecda887b08ef730d68290a61081ef2566glennrp 378ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR04PixelRed(pixel) \ 3798e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 38016ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 3818e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xf0; \ 38216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,\ 38316ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 3848e58efdecda887b08ef730d68290a61081ef2566glennrp } 38554cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelGreen(pixel) \ 3868e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 38716ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 3888e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xf0; \ 38916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,\ 39016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 3918e58efdecda887b08ef730d68290a61081ef2566glennrp } 39254cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelBlue(pixel) \ 3938e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3948e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 39516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,(pixel))) & 0xf0; \ 39616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,\ 39716ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 3988e58efdecda887b08ef730d68290a61081ef2566glennrp } 39916ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PixelAlpha(pixel) \ 4008e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4018e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 40216ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) & 0xf0; \ 40316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,\ 40416ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 4058e58efdecda887b08ef730d68290a61081ef2566glennrp } 4068e58efdecda887b08ef730d68290a61081ef2566glennrp 40754cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelRGB(pixel) \ 408bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 409ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR04PixelRed((pixel)); \ 41054cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelGreen((pixel)); \ 41154cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelBlue((pixel)); \ 412bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4138e58efdecda887b08ef730d68290a61081ef2566glennrp 41416ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PixelRGBA(pixel) \ 415bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 41654cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelRGB((pixel)); \ 41716ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PixelAlpha((pixel)); \ 418bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4198e58efdecda887b08ef730d68290a61081ef2566glennrp 4208e58efdecda887b08ef730d68290a61081ef2566glennrp 4218e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR08: Replicate top 8 bits */ 4228e58efdecda887b08ef730d68290a61081ef2566glennrp 42305001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR08PacketRed(pixelpacket) \ 4248e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4258e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red); \ 4268e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum((lbr_bits)); \ 4278e58efdecda887b08ef730d68290a61081ef2566glennrp } 42891d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR08PacketGreen(pixelpacket) \ 4298e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4308e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green); \ 4318e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum((lbr_bits)); \ 4328e58efdecda887b08ef730d68290a61081ef2566glennrp } 43391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR08PacketBlue(pixelpacket) \ 4348e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4358e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue); \ 4368e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum((lbr_bits)); \ 4378e58efdecda887b08ef730d68290a61081ef2566glennrp } 43816ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR08PacketAlpha(pixelpacket) \ 4398e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 44016ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).alpha); \ 44116ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleCharToQuantum((lbr_bits)); \ 4428e58efdecda887b08ef730d68290a61081ef2566glennrp } 4438e58efdecda887b08ef730d68290a61081ef2566glennrp 44491d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR08PacketRGB(pixelpacket) \ 445bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 44605001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR08PacketRed((pixelpacket)); \ 44791d99255dd77083750426ba5463e002a586bc9a6glennrp LBR08PacketGreen((pixelpacket)); \ 44891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR08PacketBlue((pixelpacket)); \ 449bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4508e58efdecda887b08ef730d68290a61081ef2566glennrp 45191d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR08PacketRGBO(pixelpacket) \ 452bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 45391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR08PacketRGB((pixelpacket)); \ 45416ea139d53d867211d3bb0fa859a83de653f687ecristy LBR08PacketAlpha((pixelpacket)); \ 455bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4568e58efdecda887b08ef730d68290a61081ef2566glennrp 457ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR08PixelRed(pixel) \ 4588e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4598e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 46016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelRed(image,(pixel))); \ 46116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,\ 46216ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits)), (pixel)); \ 4638e58efdecda887b08ef730d68290a61081ef2566glennrp } 46454cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR08PixelGreen(pixel) \ 4658e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4668e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 46716ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelGreen(image,(pixel))); \ 46816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,\ 46916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits)), (pixel)); \ 4708e58efdecda887b08ef730d68290a61081ef2566glennrp } 47154cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR08PixelBlue(pixel) \ 4728e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4738e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 47416ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,(pixel))); \ 47516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,\ 47616ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits)), (pixel)); \ 4778e58efdecda887b08ef730d68290a61081ef2566glennrp } 47816ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR08PixelAlpha(pixel) \ 4798e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4808e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 48116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelAlpha(image,(pixel))); \ 48216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,\ 48316ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits)), (pixel)); \ 4848e58efdecda887b08ef730d68290a61081ef2566glennrp } 4858e58efdecda887b08ef730d68290a61081ef2566glennrp 48654cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR08PixelRGB(pixel) \ 487bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 488ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR08PixelRed((pixel)); \ 48954cf79782d2eba6612b706093f62474beb855c8dglennrp LBR08PixelGreen((pixel)); \ 49054cf79782d2eba6612b706093f62474beb855c8dglennrp LBR08PixelBlue((pixel)); \ 491bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4928e58efdecda887b08ef730d68290a61081ef2566glennrp 49316ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR08PixelRGBA(pixel) \ 494bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 49554cf79782d2eba6612b706093f62474beb855c8dglennrp LBR08PixelRGB((pixel)); \ 49616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR08PixelAlpha((pixel)); \ 497bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4988e58efdecda887b08ef730d68290a61081ef2566glennrp 4998e58efdecda887b08ef730d68290a61081ef2566glennrp 5008e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR16: Replicate top 16 bits */ 5018e58efdecda887b08ef730d68290a61081ef2566glennrp 50205001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR16PacketRed(pixelpacket) \ 5038e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5048e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits=ScaleQuantumToShort((pixelpacket).red); \ 5058e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleShortToQuantum((lbr_bits)); \ 5068e58efdecda887b08ef730d68290a61081ef2566glennrp } 50791d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR16PacketGreen(pixelpacket) \ 5088e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5098e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits=ScaleQuantumToShort((pixelpacket).green); \ 5108e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleShortToQuantum((lbr_bits)); \ 5118e58efdecda887b08ef730d68290a61081ef2566glennrp } 51291d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR16PacketBlue(pixelpacket) \ 5138e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5148e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits=ScaleQuantumToShort((pixelpacket).blue); \ 5158e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleShortToQuantum((lbr_bits)); \ 5168e58efdecda887b08ef730d68290a61081ef2566glennrp } 51716ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR16PacketAlpha(pixelpacket) \ 5188e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 51916ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned short lbr_bits=ScaleQuantumToShort((pixelpacket).alpha); \ 52016ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleShortToQuantum((lbr_bits)); \ 5218e58efdecda887b08ef730d68290a61081ef2566glennrp } 5228e58efdecda887b08ef730d68290a61081ef2566glennrp 52391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR16PacketRGB(pixelpacket) \ 524bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 52505001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR16PacketRed((pixelpacket)); \ 52691d99255dd77083750426ba5463e002a586bc9a6glennrp LBR16PacketGreen((pixelpacket)); \ 52791d99255dd77083750426ba5463e002a586bc9a6glennrp LBR16PacketBlue((pixelpacket)); \ 528bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 5298e58efdecda887b08ef730d68290a61081ef2566glennrp 53091d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR16PacketRGBO(pixelpacket) \ 531bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 53291d99255dd77083750426ba5463e002a586bc9a6glennrp LBR16PacketRGB((pixelpacket)); \ 53316ea139d53d867211d3bb0fa859a83de653f687ecristy LBR16PacketAlpha((pixelpacket)); \ 534bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 5358e58efdecda887b08ef730d68290a61081ef2566glennrp 536ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR16PixelRed(pixel) \ 5378e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5388e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits= \ 53916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelRed(image,(pixel))); \ 54016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,\ 54116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleShortToQuantum((lbr_bits)),(pixel)); \ 5428e58efdecda887b08ef730d68290a61081ef2566glennrp } 54354cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR16PixelGreen(pixel) \ 5448e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5458e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits= \ 54616ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,(pixel))); \ 54716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,\ 54816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleShortToQuantum((lbr_bits)),(pixel)); \ 5498e58efdecda887b08ef730d68290a61081ef2566glennrp } 55054cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR16PixelBlue(pixel) \ 5518e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5528e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits= \ 55316ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,(pixel))); \ 55416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,\ 55516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleShortToQuantum((lbr_bits)),(pixel)); \ 5568e58efdecda887b08ef730d68290a61081ef2566glennrp } 55716ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR16PixelAlpha(pixel) \ 5588e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 5598e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned short lbr_bits= \ 56016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelAlpha(image,(pixel))); \ 56116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,\ 56216ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleShortToQuantum((lbr_bits)),(pixel)); \ 5638e58efdecda887b08ef730d68290a61081ef2566glennrp } 5648e58efdecda887b08ef730d68290a61081ef2566glennrp 56554cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR16PixelRGB(pixel) \ 566bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 567ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR16PixelRed((pixel)); \ 56854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR16PixelGreen((pixel)); \ 56954cf79782d2eba6612b706093f62474beb855c8dglennrp LBR16PixelBlue((pixel)); \ 570bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 5718e58efdecda887b08ef730d68290a61081ef2566glennrp 57216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR16PixelRGBA(pixel) \ 573bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 57454cf79782d2eba6612b706093f62474beb855c8dglennrp LBR16PixelRGB((pixel)); \ 57516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR16PixelAlpha((pixel)); \ 576bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 5778e58efdecda887b08ef730d68290a61081ef2566glennrp 5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Establish thread safety. 5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is claimed to be safe on these platforms: 5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is alleged to be unsafe on these platforms: 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef SETJMP_IS_THREAD_SAFE 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_SETJMP_NOT_THREAD_SAFE 5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 587edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo 589cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_semaphore = (SemaphoreInfo *) NULL; 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This temporary until I set up malloc'ed object attributes array. 5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Recompile with MNG_MAX_OBJECTS=65536L to avoid this limit but 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy waste more memory. 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_MAX_OBJECTS 256 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If this not defined, spec is interpreted strictly. If it is 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined, an attempt will be made to recover from some errors, 6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy including 6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o global PLTE too short 6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_LOOSE 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Don't try to define PNG_MNG_FEATURES_SUPPORTED here. Make sure 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy it's defined in libpng/pngconf.h, version 1.0.9 or later. It won't work 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy with earlier versions of libpng. From libpng-1.0.3a to libpng-1.0.8, 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_READ|WRITE_EMPTY_PLTE were used but those have been deprecated in 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy libpng in favor of PNG_MNG_FEATURES_SUPPORTED, so we set them here. 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_MNG_FEATURES_SUPPORTED is disabled by default in libpng-1.0.9 and 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy will be enabled by default in libpng-1.2.0. 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_MNG_FEATURES_SUPPORTED 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_READ_EMPTY_PLTE_SUPPORTED 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_WRITE_EMPTY_PLTE_SUPPORTED 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_WRITE_EMPTY_PLTE_SUPPORTED 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 626bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Maximum valid size_t in PNG/MNG chunks is (2^31)-1 6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This macro is only defined in libpng-1.0.3 and later. 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Previously it was PNG_MAX_UINT but that was deprecated in libpng-1.2.6 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_UINT_31_MAX 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_UINT_31_MAX (png_uint_32) 0x7fffffffL 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Constant strings for known chunk types. If you need to add a chunk, 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy add a string holding the name here. To make the code more 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy portable, we use ASCII numbers like this, not characters. 6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_MHDR[5]={ 77, 72, 68, 82, (png_byte) '\0'}; 64185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_BACK[5]={ 66, 65, 67, 75, (png_byte) '\0'}; 64285dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_BASI[5]={ 66, 65, 83, 73, (png_byte) '\0'}; 64385dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_CLIP[5]={ 67, 76, 73, 80, (png_byte) '\0'}; 64485dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_CLON[5]={ 67, 76, 79, 78, (png_byte) '\0'}; 64585dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_DEFI[5]={ 68, 69, 70, 73, (png_byte) '\0'}; 64685dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_DHDR[5]={ 68, 72, 68, 82, (png_byte) '\0'}; 64785dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_DISC[5]={ 68, 73, 83, 67, (png_byte) '\0'}; 64885dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_ENDL[5]={ 69, 78, 68, 76, (png_byte) '\0'}; 64985dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_FRAM[5]={ 70, 82, 65, 77, (png_byte) '\0'}; 65085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_IEND[5]={ 73, 69, 78, 68, (png_byte) '\0'}; 65185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_IHDR[5]={ 73, 72, 68, 82, (png_byte) '\0'}; 65285dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_JHDR[5]={ 74, 72, 68, 82, (png_byte) '\0'}; 65385dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_LOOP[5]={ 76, 79, 79, 80, (png_byte) '\0'}; 65485dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_MAGN[5]={ 77, 65, 71, 78, (png_byte) '\0'}; 65585dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_MEND[5]={ 77, 69, 78, 68, (png_byte) '\0'}; 65685dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_MOVE[5]={ 77, 79, 86, 69, (png_byte) '\0'}; 65785dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_PAST[5]={ 80, 65, 83, 84, (png_byte) '\0'}; 65885dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_PLTE[5]={ 80, 76, 84, 69, (png_byte) '\0'}; 65985dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_SAVE[5]={ 83, 65, 86, 69, (png_byte) '\0'}; 66085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_SEEK[5]={ 83, 69, 69, 75, (png_byte) '\0'}; 66185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_SHOW[5]={ 83, 72, 79, 87, (png_byte) '\0'}; 66285dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_TERM[5]={ 84, 69, 82, 77, (png_byte) '\0'}; 66385dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_bKGD[5]={ 98, 75, 71, 68, (png_byte) '\0'}; 66485dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_cHRM[5]={ 99, 72, 82, 77, (png_byte) '\0'}; 66585dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_gAMA[5]={103, 65, 77, 65, (png_byte) '\0'}; 66685dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; 66785dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_nEED[5]={110, 69, 69, 68, (png_byte) '\0'}; 66885dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_pHYg[5]={112, 72, 89, 103, (png_byte) '\0'}; 66985dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; 67085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_pHYs[5]={112, 72, 89, 115, (png_byte) '\0'}; 67185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_sBIT[5]={115, 66, 73, 84, (png_byte) '\0'}; 67285dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_sRGB[5]={115, 82, 71, 66, (png_byte) '\0'}; 67385dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_tRNS[5]={116, 82, 78, 83, (png_byte) '\0'}; 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 67685dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_IDAT[5]={ 73, 68, 65, 84, (png_byte) '\0'}; 67785dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_JDAT[5]={ 74, 68, 65, 84, (png_byte) '\0'}; 67885dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_JDAA[5]={ 74, 68, 65, 65, (png_byte) '\0'}; 67985dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_JdAA[5]={ 74, 100, 65, 65, (png_byte) '\0'}; 68085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_JSEP[5]={ 74, 83, 69, 80, (png_byte) '\0'}; 68185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_oFFs[5]={111, 70, 70, 115, (png_byte) '\0'}; 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristyOther known chunks that are not yet supported by ImageMagick: 68685dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_hIST[5]={104, 73, 83, 84, (png_byte) '\0'}; 68785dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; 68885dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_iTXt[5]={105, 84, 88, 116, (png_byte) '\0'}; 68985dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_sPLT[5]={115, 80, 76, 84, (png_byte) '\0'}; 69085dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_sTER[5]={115, 84, 69, 82, (png_byte) '\0'}; 69185dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_tEXt[5]={116, 69, 88, 116, (png_byte) '\0'}; 69285dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_tIME[5]={116, 73, 77, 69, (png_byte) '\0'}; 69385dcf873093881b3ed4da55c3681aa3209767aa9glennrpstatic png_byte mng_zTXt[5]={122, 84, 88, 116, (png_byte) '\0'}; 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBox 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6988182b0758e3429fb8dcd1700f09643fd4d80a41ccristy long 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy left, 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy right, 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy top, 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bottom; 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBox; 7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngPair 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7078182b0758e3429fb8dcd1700f09643fd4d80a41ccristy volatile long 7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a, 7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy b; 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngPair; 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBuffer 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 716bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height, 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width; 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte[256]; 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_count; 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_sample_depth, 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression_method, 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_type, 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy concrete, 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy filter_method, 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen, 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_type, 7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy interlace_method, 7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel_sample_depth, 7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte_length, 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sample_depth, 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable; 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBuffer; 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngInfo 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBuffer 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ob[MNG_MAX_OBJECTS]; 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image * 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image; 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy page; 7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy adjoin, 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_in_read_buffer, 7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy found_empty_plte, 7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_backgrounds, 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_chrms, 7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_gammas, 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_palettes, 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_physs, 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_srgbs, 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode, 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_bkgd, 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_chrm, 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_gama, 7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_phys, 7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_sbit, 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_srgb, 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_saved_bkgd_index, 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_chrm, 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_gama, 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_plte, 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_srgb, 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_fram, 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_framing_mode, 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy saved_bkgd_index; 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors; 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 794bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_found, 7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_count[256], 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_iteration[256], 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scenes_found, 7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_off[MNG_MAX_OBJECTS], 8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_off[MNG_MAX_OBJECTS]; 8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clip, 8043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame, 8053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_box, 8063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_clip[MNG_MAX_OBJECTS]; 8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* These flags could be combined into one byte */ 8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exists[MNG_MAX_OBJECTS], 8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen[MNG_MAX_OBJECTS], 8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_active[256], 8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy invisible[MNG_MAX_OBJECTS], 8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable[MNG_MAX_OBJECTS]; 8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_jump[256]; 8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 8203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte; 8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_8 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_sbit; 8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_buffer[8], 8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns[256]; 8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy float 8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_gamma; 8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ChromaticityInfo 8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_chrm; 8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RenderingIntent 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_srgb_intent; 8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 84035ef824baa82511126ff0072ae30eee0da9c05a3cristy unsigned int 8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy delay, 8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte_length, 8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns_length, 8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_x_pixels_per_unit, 8453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_y_pixels_per_unit, 8463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_width, 8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_height, 8483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ticks_per_second; 8493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 850b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp MagickBooleanType 851b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp need_blob; 852b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IsPalette, 8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_phys_unit_type, 8563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_warning, 8573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clon_warning, 8583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dhdr_warning, 8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jhdr_warning, 8603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_warning, 8613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy past_warning, 8623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phyg_warning, 8633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phys_warning, 8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sbit_warning, 8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy show_warning, 8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type, 8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng, 8683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_colortype, 8693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_depth, 8701868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_level, 8711868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_strategy, 8721868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_filter, 8733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png8, 8743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png24, 8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png32; 8763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 878bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_width, 8803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_height; 8813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_depth, 8843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type, 8853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method, 8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type, 8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method, 8883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red, 8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green, 8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue, 8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha, 8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable; 8933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 8973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 8993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 9003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 9013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 9023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 9033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 9043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 9053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 9063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90716ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 9083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_global_bkgd; 9093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* Added at version 6.6.6-7 */ 91126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp MagickBooleanType 91226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_bKGD, 91326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_cHRM, 914a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date, 91526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_EXIF, 91626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_gAMA, 91726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_iCCP, 91826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* ping_exclude_iTXt, */ 91926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_oFFs, 92026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_pHYs, 92126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_sRGB, 92226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_tEXt, 923a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp ping_exclude_tRNS, 92426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_vpAg, 92526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zCCP, /* hex-encoded iCCP */ 9268d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_exclude_zTXt, 9278d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap; 92826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 9293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngInfo; 9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* VER */ 9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 93616ea139d53d867211d3bb0fa859a83de653f687ecristy WritePNGImage(const ImageInfo *,Image *,ExceptionInfo *); 9370c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 93916ea139d53d867211d3bb0fa859a83de653f687ecristy WriteMNGImage(const ImageInfo *,Image *,ExceptionInfo *); 9400c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 94316ea139d53d867211d3bb0fa859a83de653f687ecristy WriteJNGImage(const ImageInfo *,Image *,ExceptionInfo *); 9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9460c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#if PNG_LIBPNG_VER > 10011 9470c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 948fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9490c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#if (MAGICKCORE_QUANTUM_DEPTH >= 16) 9500c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrpstatic MagickBooleanType 95116ea139d53d867211d3bb0fa859a83de653f687ecristyLosslessReduceDepthOK(Image *image,ExceptionInfo *exception) 9520c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp{ 9539d0ea4d0d750fa124d7b83da98ed582d59c1aab0glennrp /* Reduce bit depth if it can be reduced losslessly from 16+ to 8. 95467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * 95567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * This is true if the high byte and the next highest byte of 95667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * each sample of the image, the colormap, and the background color 9573faa9a3fb01696daaf976d595f492cb530bffb21glennrp * are equal to each other. We check this by seeing if the samples 9583faa9a3fb01696daaf976d595f492cb530bffb21glennrp * are unchanged when we scale them down to 8 and back up to Quantum. 95967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * 96067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * We don't use the method GetImageDepth() because it doesn't check 9613faa9a3fb01696daaf976d595f492cb530bffb21glennrp * background and doesn't handle PseudoClass specially. 9629d0ea4d0d750fa124d7b83da98ed582d59c1aab0glennrp */ 96305a549971fd661147ade177e2bc10f6cfcfc32b4glennrp 9643faa9a3fb01696daaf976d595f492cb530bffb21glennrp#define QuantumToCharToQuantumEqQuantum(quantum) \ 9653faa9a3fb01696daaf976d595f492cb530bffb21glennrp ((ScaleCharToQuantum((unsigned char) ScaleQuantumToChar(quantum))) == quantum) 9663faa9a3fb01696daaf976d595f492cb530bffb21glennrp 96767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp MagickBooleanType 96867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp ok_to_reduce=MagickFalse; 96967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp 97003e11f6e8d7f01a32b53d7e8e6a3bfd5ef1c5c9dglennrp if (image->depth >= 16) 9710c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9720c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 97316ea139d53d867211d3bb0fa859a83de653f687ecristy const Quantum 9740c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp *p; 9750c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9760c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ok_to_reduce= 9773faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.red) && 9783faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.green) && 9793faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.blue) ? 9803faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 9810c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9820c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce != MagickFalse && image->storage_class == PseudoClass) 9830c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9840c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp int indx; 9850c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9860c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (indx=0; indx < (ssize_t) image->colors; indx++) 9870c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9883faa9a3fb01696daaf976d595f492cb530bffb21glennrp ok_to_reduce=( 9893faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 9903faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].red) && 9913faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 9923faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].green) && 9933faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 9943faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].blue)) ? 9953faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 9963faa9a3fb01696daaf976d595f492cb530bffb21glennrp 9970c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce == MagickFalse) 9983faa9a3fb01696daaf976d595f492cb530bffb21glennrp break; 9990c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10000c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10010c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10020c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if ((ok_to_reduce != MagickFalse) && 10030c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp (image->storage_class != PseudoClass)) 10040c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 10050c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ssize_t 10060c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp y; 10070c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10080c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp register ssize_t 10090c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp x; 10100c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10110c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (y=0; y < (ssize_t) image->rows; y++) 10120c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 101316ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 10140c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 101516ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 10160c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 10170c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ok_to_reduce = MagickFalse; 10180c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 10190c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10200c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10210c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 10220c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 10233faa9a3fb01696daaf976d595f492cb530bffb21glennrp ok_to_reduce= 102416ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelRed(image,p)) && 102516ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelGreen(image,p)) && 102616ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelBlue(image,p)) ? 10273faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 10280c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10290c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce == MagickFalse) 10300c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 10310c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 103216ea139d53d867211d3bb0fa859a83de653f687ecristy p+=GetPixelChannels(image); 10330c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10348640fb5e9b1094f35f8beab436f81661b8a99448glennrp if (x >= 0) 10350c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 10360c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10370c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10380c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10390c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce != MagickFalse) 10400c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 10410c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1042fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " OK to reduce PNG bit depth to 8 without loss of info"); 10430c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 1044a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp else 1045a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp { 1046a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1047fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Not OK to reduce PNG bit depth to 8 without loss of info"); 1048a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp } 10490c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 10500c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10510c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp return ok_to_reduce; 10520c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp} 10530c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#endif /* MAGICKCORE_QUANTUM_DEPTH >= 16 */ 10540c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 10551a56e9c9268976936eeab9fe97eb664b847e444cglennrpstatic const char* PngColorTypeToString(const unsigned int color_type) 10561a56e9c9268976936eeab9fe97eb664b847e444cglennrp{ 10571a56e9c9268976936eeab9fe97eb664b847e444cglennrp const char 10581a56e9c9268976936eeab9fe97eb664b847e444cglennrp *result = "Unknown"; 10591a56e9c9268976936eeab9fe97eb664b847e444cglennrp 10601a56e9c9268976936eeab9fe97eb664b847e444cglennrp switch (color_type) 10611a56e9c9268976936eeab9fe97eb664b847e444cglennrp { 10621a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_GRAY: 10631a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Gray"; 10641a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 10651a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 10661a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Gray+Alpha"; 10671a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 10681a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_PALETTE: 10691a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Palette"; 10701a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 10711a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_RGB: 10721a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "RGB"; 10731a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 10741a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_RGB_ALPHA: 10751a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "RGB+Alpha"; 10761a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 10771a56e9c9268976936eeab9fe97eb664b847e444cglennrp } 10781a56e9c9268976936eeab9fe97eb664b847e444cglennrp 10791a56e9c9268976936eeab9fe97eb664b847e444cglennrp return result; 10801a56e9c9268976936eeab9fe97eb664b847e444cglennrp} 10811a56e9c9268976936eeab9fe97eb664b847e444cglennrp 1082e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic int 1083cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_RenderingIntent_to_PNG_RenderingIntent(const RenderingIntent intent) 10840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp{ 1085e610a071534e448c46460a5aa39ede33bf56b329glennrp switch (intent) 1086e610a071534e448c46460a5aa39ede33bf56b329glennrp { 1087e610a071534e448c46460a5aa39ede33bf56b329glennrp case PerceptualIntent: 1088e610a071534e448c46460a5aa39ede33bf56b329glennrp return 0; 10890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1090e610a071534e448c46460a5aa39ede33bf56b329glennrp case RelativeIntent: 1091e610a071534e448c46460a5aa39ede33bf56b329glennrp return 1; 10920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1093e610a071534e448c46460a5aa39ede33bf56b329glennrp case SaturationIntent: 1094e610a071534e448c46460a5aa39ede33bf56b329glennrp return 2; 10950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1096e610a071534e448c46460a5aa39ede33bf56b329glennrp case AbsoluteIntent: 1097e610a071534e448c46460a5aa39ede33bf56b329glennrp return 3; 10980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1099e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 1100e610a071534e448c46460a5aa39ede33bf56b329glennrp return -1; 1101e610a071534e448c46460a5aa39ede33bf56b329glennrp } 1102e610a071534e448c46460a5aa39ede33bf56b329glennrp} 1103e610a071534e448c46460a5aa39ede33bf56b329glennrp 1104e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic RenderingIntent 1105cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_RenderingIntent_from_PNG_RenderingIntent(const int ping_intent) 11060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp{ 1107cf002022280cc4dedb2748ad6f415aac1d44f530glennrp switch (ping_intent) 1108e610a071534e448c46460a5aa39ede33bf56b329glennrp { 1109e610a071534e448c46460a5aa39ede33bf56b329glennrp case 0: 1110e610a071534e448c46460a5aa39ede33bf56b329glennrp return PerceptualIntent; 11110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1112e610a071534e448c46460a5aa39ede33bf56b329glennrp case 1: 1113e610a071534e448c46460a5aa39ede33bf56b329glennrp return RelativeIntent; 11140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1115e610a071534e448c46460a5aa39ede33bf56b329glennrp case 2: 1116e610a071534e448c46460a5aa39ede33bf56b329glennrp return SaturationIntent; 11170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1118e610a071534e448c46460a5aa39ede33bf56b329glennrp case 3: 1119e610a071534e448c46460a5aa39ede33bf56b329glennrp return AbsoluteIntent; 11200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1121e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 1122e610a071534e448c46460a5aa39ede33bf56b329glennrp return UndefinedIntent; 1123e610a071534e448c46460a5aa39ede33bf56b329glennrp } 1124e610a071534e448c46460a5aa39ede33bf56b329glennrp} 1125e610a071534e448c46460a5aa39ede33bf56b329glennrp 1126bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline ssize_t MagickMax(const ssize_t x,const ssize_t y) 11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x > y) 11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(x); 11300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(y); 11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11330c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 11345dff435eceea4f80207a906b11e65aed48fe3f27glennrpstatic char * 11355dff435eceea4f80207a906b11e65aed48fe3f27glennrpMagick_ColorType_from_PNG_ColorType(const int ping_colortype) 11365dff435eceea4f80207a906b11e65aed48fe3f27glennrp{ 11375dff435eceea4f80207a906b11e65aed48fe3f27glennrp switch (ping_colortype) 11385dff435eceea4f80207a906b11e65aed48fe3f27glennrp { 11395dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 0: 11405dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Grayscale"; 11415dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11425dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 2: 11435dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Truecolor"; 11445dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11455dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 3: 11465dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Indexed"; 11475dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11485dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 4: 11495dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "GrayAlpha"; 11505dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11515dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 6: 11525dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "RGBA"; 11535dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11545dff435eceea4f80207a906b11e65aed48fe3f27glennrp default: 11555dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "UndefinedColorType"; 11565dff435eceea4f80207a906b11e65aed48fe3f27glennrp } 11575dff435eceea4f80207a906b11e65aed48fe3f27glennrp} 11585dff435eceea4f80207a906b11e65aed48fe3f27glennrp 11595dff435eceea4f80207a906b11e65aed48fe3f27glennrp 1160bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic inline ssize_t MagickMin(const ssize_t x,const ssize_t y) 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (x < y) 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(x); 11640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(y); 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11670c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 1168dbb105fc25903e800273f7e980c0553060858a68glennrp 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 1174dbb105fc25903e800273f7e980c0553060858a68glennrp% I m a g e I s G r a y % 11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 1179dbb105fc25903e800273f7e980c0553060858a68glennrp% % 118016ea139d53d867211d3bb0fa859a83de653f687ecristy% Like IsImageGray except does not change DirectClass to PseudoClass % 1181dbb105fc25903e800273f7e980c0553060858a68glennrp% % 1182dbb105fc25903e800273f7e980c0553060858a68glennrp%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 118416ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType ImageIsGray(Image *image,ExceptionInfo *exception) 11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 118616ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1189bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 1191dbb105fc25903e800273f7e980c0553060858a68glennrp x, 1192dbb105fc25903e800273f7e980c0553060858a68glennrp y; 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->debug != MagickFalse) 1197dbb105fc25903e800273f7e980c0553060858a68glennrp (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 1198dbb105fc25903e800273f7e980c0553060858a68glennrp 1199dbb105fc25903e800273f7e980c0553060858a68glennrp if (image->storage_class == PseudoClass) 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1201dbb105fc25903e800273f7e980c0553060858a68glennrp for (i=0; i < (ssize_t) image->colors; i++) 120216ea139d53d867211d3bb0fa859a83de653f687ecristy if (IsPixelInfoGray(image->colormap+i) == MagickFalse) 1203dbb105fc25903e800273f7e980c0553060858a68glennrp return(MagickFalse); 1204dbb105fc25903e800273f7e980c0553060858a68glennrp return(MagickTrue); 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1206bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 12073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120816ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 120916ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 1210dbb105fc25903e800273f7e980c0553060858a68glennrp return(MagickFalse); 1211dbb105fc25903e800273f7e980c0553060858a68glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 1212dbb105fc25903e800273f7e980c0553060858a68glennrp { 121316ea139d53d867211d3bb0fa859a83de653f687ecristy if (IsPixelGray(image,p) == MagickFalse) 1214dbb105fc25903e800273f7e980c0553060858a68glennrp return(MagickFalse); 121516ea139d53d867211d3bb0fa859a83de653f687ecristy p+=GetPixelChannels(image); 1216dbb105fc25903e800273f7e980c0553060858a68glennrp } 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1218dbb105fc25903e800273f7e980c0553060858a68glennrp return(MagickTrue); 1219dbb105fc25903e800273f7e980c0553060858a68glennrp} 1220d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_PNG_DELEGATE */ 12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s M N G % 12293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsMNG() returns MagickTrue if the image format type, identified by the 12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is MNG. 12363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsMNG method is: 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 12423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 12530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\212MNG\r\n\032\n",8) == 0) 12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 12560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s J N G % 12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsJNG() returns MagickTrue if the image format type, identified by the 12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is JNG. 12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsJNG method is: 12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 12900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\213JNG\r\n\032\n",8) == 0) 12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 12930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s P N G % 13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsPNG() returns MagickTrue if the image format type, identified by the 13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is PNG. 13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsPNG method is: 13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 13260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\211PNG\r\n\032\n",8) == 0) 13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 13290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1338d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER > 10011) 1339bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t WriteBlobMSBULong(Image *image,const size_t value) 13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[4]; 13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[0]=(unsigned char) (value >> 24); 13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[1]=(unsigned char) (value >> 16); 13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[2]=(unsigned char) (value >> 8); 13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[3]=(unsigned char) value; 13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((size_t) WriteBlob(image,4,buffer)); 13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13533ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGLong(png_bytep p,png_uint_32 value) 13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 13563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 13573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1361a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp#if defined(JNG_SUPPORTED) 13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGsLong(png_bytep p,png_int_32 value) 13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1369a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp#endif 13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGShort(png_bytep p,png_uint_16 value) 13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGType(png_bytep p,png_bytep type) 13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(p,type,4*sizeof(png_byte)); 13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 138203812ae402fb53d548f0e1d7d14720768f803c2dglennrpstatic void LogPNGChunk(MagickBooleanType logging, png_bytep type, 138303812ae402fb53d548f0e1d7d14720768f803c2dglennrp size_t length) 13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1387e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Writing %c%c%c%c chunk, length: %.20g", 1388e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1390d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1396d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 13983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d P N G I m a g e % 14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadPNGImage() reads a Portable Network Graphics (PNG) or 14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file and returns it. It 14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% allocates the memory necessary for the new Image structure and returns a 14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pointer to the new image or set of images. 14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadPNGImage method is: 14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 14223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do, more or less in chronological order (as of version 5.5.2, 14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% November 26, 2002 -- glennrp -- see also "To do" under WriteMNGImage): 14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Get 16-bit cheap transparency working. 14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG decoding is supposed to be in full MNG-LC compliance) 14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG encoding should be in full MNG compliance) 14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide options for choice of background to use when the MNG BACK 14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk is not present or is not mandatory (i.e., leave transparent, 14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% user specified, MNG BACK, PNG bKGD) 14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Implement LOOP/ENDL [done, but could do discretionary loops more 14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% efficiently by linking in the duplicate frames.]. 14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Decode and act on the MHDR simplicity profile (offer option to reject 14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files or attempt to process them anyway when the profile isn't LC or VLC). 14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG without Delta-PNG. 14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BACK [done a while ago except for background image ID] 14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MOVE [done 15 May 1999] 14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o CLIP [done 15 May 1999] 14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o DISC [done 19 May 1999] 14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SAVE [partially done 19 May 1999 (marks objects frozen)] 14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SEEK [partially done 19 May 1999 (discard function only)] 14563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SHOW 14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PAST 14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BASI 14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MNG-level tEXt/iTXt/zTXt 14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYg 14613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYs 14623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o sBIT 14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o bKGD 14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o iTXt (wait for libpng implementation). 14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use the scene signature to discover when an identical scene is 14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% being reused, and just point to the original image->exception instead 14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of storing another set of pixels. This not specific to MNG 14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% but could be applied generally. 14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG with Delta-PNG. 14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG tEXt/iTXt/zTXt 14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% We will not attempt to read files containing the CgBI chunk. 14763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% They are really Xcode files meant for display on the iPhone. 14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% These are not valid PNG files and it is impossible to recover 1478f54e295d6fa414fa04aa4f43767c20eda8ae555eglennrp% the original PNG from files that have been converted to Xcode-PNG, 14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% since irretrievable loss of color data has occurred due to the 14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% use of premultiplied alpha. 14813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 14843ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 14883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This the function that does the actual reading of data. It is 14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the same as the one supplied in libpng, except that it receives the 14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy datastream from the ReadBlob() function instead of standard input. 14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 14953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,data); 15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy msg[MaxTextExtent]; 15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15093b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 1510e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "Expected %.20g bytes; found %.20g bytes",(double) length, 1511e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) check); 15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_warning(png_ptr,msg); 15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PNG_READ_EMPTY_PLTE_SUPPORTED) && \ 15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !defined(PNG_MNG_FEATURES_SUPPORTED) 15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* We use mng_get_data() instead of png_get_data() if we have a libpng 15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * older than libpng-1.0.3a, which was the first to allow the empty 15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * PLTE, or a newer libpng in which PNG_MNG_FEATURES_SUPPORTED was 15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * ifdef'ed out. Earlier versions would crash if the bKGD chunk was 15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * encountered after an empty PLTE, so we have to look ahead for bKGD 15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * chunks and remove them from the datastream that is passed to libpng, 15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and store their contents for later use. 15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 15283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void mng_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 15343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 15353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 15373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1539bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i=0; 15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) png_get_io_ptr(png_ptr); 15443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) mng_info->image; 15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (mng_info->bytes_in_read_buffer && length) 15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[i]=mng_info->read_buffer[i]; 15483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer--; 15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length--; 15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i++; 15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,(char *) data); 15550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 15580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 15623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 0)) 15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 15653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 15683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_PLTE,4) == 0) 15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickTrue; 15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_IEND,4) == 0) 15713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 1)) 15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 15833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 15843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_bKGD,4) == 0) 15853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->found_empty_plte) 15863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Skip the bKGD data byte and CRC. 15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) 15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReadBlob(image,5,(char *) mng_info->read_buffer); 15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 15943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->saved_bkgd_index=mng_info->read_buffer[0]; 15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickTrue; 15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_put_data(png_structp png_ptr,png_bytep data,png_size_t length) 16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 16073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 16083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 16143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1615bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy check=(png_size_t) WriteBlob(image,(size_t) length,data); 16160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 16183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"WriteBlob Failed"); 16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_flush_data(png_structp png_ptr) 16233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_ptr; 16253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 16283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int PalettesAreEqual(Image *a,Image *b) 16293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1630bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 16313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 16323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a == (Image *) NULL) || (b == (Image *) NULL)) 16343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 16350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->storage_class != PseudoClass || b->storage_class != PseudoClass) 16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 16380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->colors != b->colors) 16403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 16410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1642bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) a->colors; i++) 16433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a->colormap[i].red != b->colormap[i].red) || 16453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].green != b->colormap[i].green) || 16463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].blue != b->colormap[i].blue)) 16473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 16483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickTrue); 16513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16543ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void MngInfoDiscardObject(MngInfo *mng_info,int i) 16553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i && (i < MNG_MAX_OBJECTS) && (mng_info != (MngInfo *) NULL) && 16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i] && !mng_info->frozen[i]) 16583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 16603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count > 0) 16633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->reference_count--; 16640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count == 0) 16663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->image != (Image *) NULL) 16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->image=DestroyImage(mng_info->ob[i]->image); 16690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=DestroyString(mng_info->ob[i]); 16713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=(MngBuffer *) NULL; 16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i]=MagickFalse; 16763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[i]=MagickFalse; 16773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[i]=MagickFalse; 16783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickFalse; 16793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->x_off[i]=0; 16803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->y_off[i]=0; 16813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].left=0; 1682bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 16833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].top=0; 1684bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 168821f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrpstatic void MngInfoFreeStruct(MngInfo *mng_info, 168921f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp MagickBooleanType *have_mng_structure) 16903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 169121f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp if (*have_mng_structure != MagickFalse && (mng_info != (MngInfo *) NULL)) 16923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1693bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 16943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 16980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte != (png_colorp) NULL) 17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) 17013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RelinquishMagickMemory(mng_info->global_plte); 17020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) RelinquishMagickMemory(mng_info); 17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *have_mng_structure=MagickFalse; 17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_minimum_box(MngBox box1,MngBox box2) 17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box=box1; 17143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.left < box2.left) 17153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left=box2.left; 17160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.top < box2.top) 17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top=box2.top; 17190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.right > box2.right) 17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right=box2.right; 17220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.bottom > box2.bottom) 17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom=box2.bottom; 17250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return box; 17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_read_box(MngBox previous_box,char delta_type,unsigned char *p) 17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 17333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read clipping boundaries from DEFI, CLIP, FRAM, or PAST chunk. 17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1737bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.left=(ssize_t) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 1738bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.right=(ssize_t) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 1739bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.top=(ssize_t) ((p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11]); 1740bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.bottom=(ssize_t) ((p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15]); 17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left+=previous_box.left; 17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right+=previous_box.right; 17453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top+=previous_box.top; 17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom+=previous_box.bottom; 17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(box); 17503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17523ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngPair mng_read_pair(MngPair previous_pair,int delta_type, 17533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char *p) 17543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair; 17573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1758bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Read two ssize_ts from CLON, MOVE or PAST chunk 17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 17608182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.a=(long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 17618182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.b=(long) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 17620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 17643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.a+=previous_pair.a; 17663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.b+=previous_pair.b; 17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(pair); 17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17728182b0758e3429fb8dcd1700f09643fd4d80a41ccristystatic long mng_get_long(unsigned char *p) 17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17748182b0758e3429fb8dcd1700f09643fd4d80a41ccristy return((long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3])); 17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 177716ea139d53d867211d3bb0fa859a83de653f687ecristytypedef struct _PNGErrorInfo 177816ea139d53d867211d3bb0fa859a83de653f687ecristy{ 177916ea139d53d867211d3bb0fa859a83de653f687ecristy Image 178016ea139d53d867211d3bb0fa859a83de653f687ecristy *image; 178116ea139d53d867211d3bb0fa859a83de653f687ecristy 178216ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 178316ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 178416ea139d53d867211d3bb0fa859a83de653f687ecristy} PNGErrorInfo; 178516ea139d53d867211d3bb0fa859a83de653f687ecristy 1786cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic void MagickPNGErrorHandler(png_struct *ping,png_const_charp message) 17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 178816ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 178916ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 179016ea139d53d867211d3bb0fa859a83de653f687ecristy 17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 17923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 179416ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 179516ea139d53d867211d3bb0fa859a83de653f687ecristy *error_info; 17960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 179716ea139d53d867211d3bb0fa859a83de653f687ecristy error_info=(PNGErrorInfo *) png_get_error_ptr(ping); 179816ea139d53d867211d3bb0fa859a83de653f687ecristy image=error_info->image; 179916ea139d53d867211d3bb0fa859a83de653f687ecristy exception=error_info->exception; 1800c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy 180116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 180216ea139d53d867211d3bb0fa859a83de653f687ecristy " libpng-%s error: %s", PNG_LIBPNG_VER_STRING,message); 180316ea139d53d867211d3bb0fa859a83de653f687ecristy 180416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError,message, 180516ea139d53d867211d3bb0fa859a83de653f687ecristy "`%s'",image->filename); 18060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1807e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 18088371ecc013ff231ce380d8717e517312e62e1f01glennrp /* A warning about deprecated use of jmpbuf here is unavoidable if you 18098371ecc013ff231ce380d8717e517312e62e1f01glennrp * are building with libpng-1.4.x and can be ignored. 18108371ecc013ff231ce380d8717e517312e62e1f01glennrp */ 18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy longjmp(ping->jmpbuf,1); 1812faa852bad40107edae19405e76a299057668d795glennrp#else 1813faa852bad40107edae19405e76a299057668d795glennrp png_longjmp(ping,1); 1814faa852bad40107edae19405e76a299057668d795glennrp#endif 18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1817cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic void MagickPNGWarningHandler(png_struct *ping,png_const_charp message) 18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 181916ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 182016ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 182116ea139d53d867211d3bb0fa859a83de653f687ecristy 18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 18233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 18243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 182516ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 182616ea139d53d867211d3bb0fa859a83de653f687ecristy *error_info; 182716ea139d53d867211d3bb0fa859a83de653f687ecristy 18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(message, "Missing PLTE before tRNS") == 0) 18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping, message); 18300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 183116ea139d53d867211d3bb0fa859a83de653f687ecristy error_info=(PNGErrorInfo *) png_get_error_ptr(ping); 183216ea139d53d867211d3bb0fa859a83de653f687ecristy image=error_info->image; 183316ea139d53d867211d3bb0fa859a83de653f687ecristy exception=error_info->exception; 183416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 183516ea139d53d867211d3bb0fa859a83de653f687ecristy " libpng-%s warning: %s", PNG_LIBPNG_VER_STRING,message); 18360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 183716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderWarning, 18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy message,"`%s'",image->filename); 18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 1842cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic png_voidp Magick_png_malloc(png_structp png_ptr,png_uint_32 size) 18433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1844df0d90e1d3bbfa3956818ac7bf43aa0d008020dccristy (void) png_ptr; 18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_voidp) AcquireMagickMemory((size_t) size)); 18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free a pointer. It is removed from the list at the same time. 18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1851cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic png_free_ptr Magick_png_free(png_structp png_ptr,png_voidp ptr) 18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 18533bd393f9074299ed9f2f3d128e4985118077c2bdglennrp (void) png_ptr; 18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptr=RelinquishMagickMemory(ptr); 18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_free_ptr) NULL); 18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 18603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int 1864edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrpMagick_png_read_raw_profile(png_struct *ping,Image *image, 1865edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp const ImageInfo *image_info, png_textp text,int ii,ExceptionInfo *exception) 18663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1867bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 18683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 18693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 18713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp; 18723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register png_charp 18743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp; 18753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles; 18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18830c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp const unsigned char 18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0, 18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,10,11,12, 18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13,14,15}; 18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=text[ii].text+1; 18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for newline */ 18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != '\n') 18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 18950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for length */ 18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp == '\0' || *sp == ' ' || *sp == '\n') 18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 18990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1900f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy length=(png_uint_32) StringToLong(sp); 19010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 190297f90e23c85b9c58387880125c29d8c99126f83aglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 190397f90e23c85b9c58387880125c29d8c99126f83aglennrp " length: %lu",(unsigned long) length); 190497f90e23c85b9c58387880125c29d8c99126f83aglennrp 19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != ' ' && *sp != '\n') 19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 19070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* allocate space */ 19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 0) 19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1911edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping,"invalid profile length"); 19123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19158723e4bcd840478cecfd29891e792edb499cd0e9cristy profile=BlobToStringInfo((const void *) NULL,length); 19160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile == (StringInfo *) NULL) 19183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1919edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, "unable to copy profile"); 19203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 19213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* copy profile, skipping white space and column 1 "=" signs */ 19243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=GetStringInfoDatum(profile); 19253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles=length*2; 19260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1927bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) nibbles; i++) 19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') 19303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 19313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*sp == '\0') 19323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1933edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, "ran out of profile data"); 19343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 19353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 19363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 19383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%2 == 0) 19413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp=(unsigned char) (16*unhex[(int) *sp++]); 19420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 19443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*dp++)+=unhex[(int) *sp++]; 19453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 19463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 19473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy We have already read "Raw profile type. 19483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 194916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProfile(image,&text[ii].key[17],profile,exception); 19503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 19510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 19533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf(" Found a generic profile, type %s\n",&text[ii].key[17]); 19540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 19553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return MagickTrue; 19563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 19573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 19593ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int read_vpag_chunk_callback(png_struct *ping, png_unknown_chunkp chunk) 19603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 19613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 19623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 19633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* The unknown chunk structure contains the chunk data: 19663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte name[5]; 19673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte *data; 19683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t size; 19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note that libpng has already taken care of the CRC handling. 19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->name[0] != 118 || chunk->name[1] != 112 || 19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk->name[2] != 65 ||chunk-> name[3] != 103) 19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* Did not recognize */ 19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* recognized vpAg */ 19793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->size != 9) 19813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(-1); /* Error return */ 19823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->data[8] != 0) 19843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* ImageMagick requires pixel units */ 19853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_user_chunk_ptr(ping); 19873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1988bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.width=(size_t) ((chunk->data[0] << 24) | 19893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[1] << 16) | (chunk->data[2] << 8) | chunk->data[3]); 19900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1991bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.height=(size_t) ((chunk->data[4] << 24) | 19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[5] << 16) | (chunk->data[6] << 8) | chunk->data[7]); 19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Return one of the following: */ 19953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(-n); chunk had an error */ 19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(0); did not recognize */ 19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(n); success */ 19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(1); 20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e P N G I m a g e % 20103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOnePNGImage() reads a Portable Network Graphics (PNG) image file 20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOnePNGImage method is: 20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOnePNGImage(MngInfo *mng_info, const ImageInfo *image_info, 20233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 20243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 20263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 20283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 20323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 20333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 20343ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOnePNGImage(MngInfo *mng_info, 20353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 20363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 20373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Read one PNG image */ 20383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2039cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp /* To do: Read the tIME chunk into the date:modify property */ 2040cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp /* To do: Read the tEXt/Creation Time chunk into the date:create property */ 2041cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp 20423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 20433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 20443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 20464eb3931feb349dd87142c78503b779228f3e1a0fglennrp intent, 2047cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_raw_profiles, 20483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_text, 20494eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_text_total, 20503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 2051faa852bad40107edae19405e76a299057668d795glennrp pass, 2052faa852bad40107edae19405e76a299057668d795glennrp ping_bit_depth, 2053faa852bad40107edae19405e76a299057668d795glennrp ping_color_type, 2054faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method, 2055faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method, 2056faa852bad40107edae19405e76a299057668d795glennrp ping_filter_method, 20574eb3931feb349dd87142c78503b779228f3e1a0fglennrp ping_num_trans, 20584eb3931feb349dd87142c78503b779228f3e1a0fglennrp unit_type; 20594eb3931feb349dd87142c78503b779228f3e1a0fglennrp 20604eb3931feb349dd87142c78503b779228f3e1a0fglennrp double 20614eb3931feb349dd87142c78503b779228f3e1a0fglennrp file_gamma; 20623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 20644383ec8c3c8811128f5a8a034d67c47db5e7e75acristy logging, 20653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 20663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 206716ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 206816ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color; 206916ea139d53d867211d3bb0fa859a83de653f687ecristy 207016ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 207116ea139d53d867211d3bb0fa859a83de653f687ecristy error_info; 207216ea139d53d867211d3bb0fa859a83de653f687ecristy 2073faa852bad40107edae19405e76a299057668d795glennrp png_bytep 2074faa852bad40107edae19405e76a299057668d795glennrp ping_trans_alpha; 2075faa852bad40107edae19405e76a299057668d795glennrp 2076faa852bad40107edae19405e76a299057668d795glennrp png_color_16p 2077faa852bad40107edae19405e76a299057668d795glennrp ping_background, 2078faa852bad40107edae19405e76a299057668d795glennrp ping_trans_color; 2079faa852bad40107edae19405e76a299057668d795glennrp 20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *end_info, 20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 20833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 20853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 20863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 20883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 20893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2090faa852bad40107edae19405e76a299057668d795glennrp png_uint_32 2091faa852bad40107edae19405e76a299057668d795glennrp ping_height, 2092faa852bad40107edae19405e76a299057668d795glennrp ping_width, 20934eb3931feb349dd87142c78503b779228f3e1a0fglennrp x_resolution, 20944eb3931feb349dd87142c78503b779228f3e1a0fglennrp y_resolution; 2095faa852bad40107edae19405e76a299057668d795glennrp 209616ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumInfo 209716ea139d53d867211d3bb0fa859a83de653f687ecristy *quantum_info; 209816ea139d53d867211d3bb0fa859a83de653f687ecristy 20993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 2100cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_pixels; 21013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2102bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 2103756ae430d36380dfab8ca703538f5922f3796351cristy ping_rowbytes, 21043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 21053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 21073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 21083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2109bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 21103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 21113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 21123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 211316ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 21143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 21153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 211739992b4dd9b12ef752d55b8e402c069698851f72glennrp length, 21183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset; 21193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2120eb3b22a03f31af7f724573d8537cd91fca06ee41cristy ssize_t 2121eb3b22a03f31af7f724573d8537cd91fca06ee41cristy j; 2122eb3b22a03f31af7f724573d8537cd91fca06ee41cristy 2123629960f505ebba710ec9b6953a539a21dab176f2glennrp#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED 21243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte unused_chunks[]= 21253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 104, 73, 83, 84, (png_byte) '\0', /* hIST */ 21273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ 21283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ 21293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ 21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116, 73, 77, 69, (png_byte) '\0', /* tIME */ 2132629960f505ebba710ec9b6953a539a21dab176f2glennrp#ifdef PNG_APNG_SUPPORTED /* libpng was built with APNG patch; */ 2133629960f505ebba710ec9b6953a539a21dab176f2glennrp /* ignore the APNG chunks */ 2134629960f505ebba710ec9b6953a539a21dab176f2glennrp 97, 99, 84, 76, (png_byte) '\0', /* acTL */ 2135629960f505ebba710ec9b6953a539a21dab176f2glennrp 102, 99, 84, 76, (png_byte) '\0', /* fcTL */ 2136629960f505ebba710ec9b6953a539a21dab176f2glennrp 102, 100, 65, 84, (png_byte) '\0', /* fdAT */ 2137629960f505ebba710ec9b6953a539a21dab176f2glennrp#endif 21383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 21403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 21413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 2142fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter ReadOnePNGImage()"); 21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 214425c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if (PNG_LIBPNG_VER < 10200) 21453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 21473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 215061b4c957269727a0a2526edc2331881da8346100glennrp#if (PNG_LIBPNG_VER >= 10400) 215161b4c957269727a0a2526edc2331881da8346100glennrp# ifndef PNG_TRANSFORM_GRAY_TO_RGB /* Added at libpng-1.4.0beta67 */ 215261b4c957269727a0a2526edc2331881da8346100glennrp if (image_info->verbose) 215361b4c957269727a0a2526edc2331881da8346100glennrp { 215461b4c957269727a0a2526edc2331881da8346100glennrp printf("Your PNG library (libpng-%s) is an old beta version.\n", 215561b4c957269727a0a2526edc2331881da8346100glennrp PNG_LIBPNG_VER_STRING); 215661b4c957269727a0a2526edc2331881da8346100glennrp printf("Please update it.\n"); 215761b4c957269727a0a2526edc2331881da8346100glennrp } 215861b4c957269727a0a2526edc2331881da8346100glennrp# endif 215961b4c957269727a0a2526edc2331881da8346100glennrp#endif 216061b4c957269727a0a2526edc2331881da8346100glennrp 216116ea139d53d867211d3bb0fa859a83de653f687ecristy 216216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info = (QuantumInfo *) NULL; 21633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 21643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2165a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 2166a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void)LogMagickEvent(CoderEvent,GetMagickModule(), 2167a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " image->matte=%d",(int) image->matte); 2168a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 21690e319739731741c52a6303723e0c8678a0df5579glennrp /* Set to an out-of-range color unless tRNS chunk is present */ 21700e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.red=65537; 21710e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.green=65537; 21720e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.blue=65537; 217316ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha=65537; 21740e319739731741c52a6303723e0c8678a0df5579glennrp 2175cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_text = 0; 21764eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_text_total = 0; 2177cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_raw_profiles = 0; 2178cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 21813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 218316ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.image=image; 218416ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.exception=exception; 218516ea139d53d867211d3bb0fa859a83de653f687ecristy ping=png_create_read_struct_2(PNG_LIBPNG_VER_STRING,&error_info, 2186cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler, NULL, 2187cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); 21883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 218916ea139d53d867211d3bb0fa859a83de653f687ecristy ping=png_create_read_struct(PNG_LIBPNG_VER_STRING,&error_info, 2190cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler); 21913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 21940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 21960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 21983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,(png_info **) NULL,(png_info **) NULL); 22003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 22013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy end_info=png_create_info_struct(ping); 22040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (end_info == (png_info *) NULL) 22063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,(png_info **) NULL); 22083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 22093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2211cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) NULL; 22120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2213faa852bad40107edae19405e76a299057668d795glennrp if (setjmp(png_jmpbuf(ping))) 22143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG image is corrupt. 22173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 2219edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2220edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 2221cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2223edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2224edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp if (ping_pixels != (unsigned char *) NULL) 2225edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp ping_pixels=(unsigned char *) RelinquishMagickMemory(ping_pixels); 2226edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() with error."); 22300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 22327b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy { 223316ea139d53d867211d3bb0fa859a83de653f687ecristy InheritException(exception,exception); 22347b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy image->columns=0; 22357b755eb4f94efbb57160cce0d7afe7f8ed4ef066cristy } 22360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2239edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2240edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* { For navigation to end of SETJMP-protected block. Within this 2241edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * block, use png_error() instead of Throwing an Exception, to ensure 2242edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * that libpng is able to clean up, and that the semaphore is unlocked. 2243edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 2244edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2245edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 2246edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp LockSemaphoreInfo(ping_semaphore); 2247edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 2248edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 22493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for reading. 22513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2252faa852bad40107edae19405e76a299057668d795glennrp 22533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 22543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sig_bytes(ping,8); 22550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 22573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 22593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 22603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 22623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) 22633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 22643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 22663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 22673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 22683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 22693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 22703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,mng_info,mng_get_data); 22713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 22763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 22793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Ignore unused chunks and all unknown chunks except for vpAg */ 22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, NULL, 0); 22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 2, mng_vpAg, 1); 22823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, unused_chunks, 22833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int)sizeof(unused_chunks)/5); 22843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Callback for other unknown chunks */ 22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_user_chunk_fn(ping, image, read_vpag_chunk_callback); 22863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22889bf97b6c2143eb20c330346b01e82102cc082725glennrp#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED 22899bf97b6c2143eb20c330346b01e82102cc082725glennrp /* Disable new libpng-1.5.10 feature */ 22909bf97b6c2143eb20c330346b01e82102cc082725glennrp png_set_check_for_invalid_index (ping, 0); 22919bf97b6c2143eb20c330346b01e82102cc082725glennrp#endif 22929bf97b6c2143eb20c330346b01e82102cc082725glennrp 2293991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp#if (PNG_LIBPNG_VER < 10400) 2294991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# if defined(PNG_USE_PNGGCCRD) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ 2295991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp (PNG_LIBPNG_VER >= 10200) && (PNG_LIBPNG_VER < 10220) && defined(__i386__) 22963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Disable thread-unsafe features of pnggccrd */ 22973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_access_version_number() >= 10200) 22983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 mmx_disable_mask=0; 23003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 asm_flags; 23013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ 23033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ 23043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ 23053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); 23063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy asm_flags=png_get_asm_flags(ping); 23073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_asm_flags(ping, asm_flags & ~mmx_disable_mask); 23083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2309991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# endif 23103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_info(ping,ping_info); 2313faa852bad40107edae19405e76a299057668d795glennrp 2314faa852bad40107edae19405e76a299057668d795glennrp png_get_IHDR(ping,ping_info,&ping_width,&ping_height, 2315faa852bad40107edae19405e76a299057668d795glennrp &ping_bit_depth,&ping_color_type, 2316faa852bad40107edae19405e76a299057668d795glennrp &ping_interlace_method,&ping_compression_method, 2317faa852bad40107edae19405e76a299057668d795glennrp &ping_filter_method); 2318faa852bad40107edae19405e76a299057668d795glennrp 2319faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_tRNS(ping, ping_info, &ping_trans_alpha, &ping_num_trans, 2320faa852bad40107edae19405e76a299057668d795glennrp &ping_trans_color); 2321faa852bad40107edae19405e76a299057668d795glennrp 2322faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_bKGD(ping, ping_info, &ping_background); 2323faa852bad40107edae19405e76a299057668d795glennrp 2324faa852bad40107edae19405e76a299057668d795glennrp if (ping_bit_depth < 8) 23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2326faa852bad40107edae19405e76a299057668d795glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) 2327faa852bad40107edae19405e76a299057668d795glennrp { 2328faa852bad40107edae19405e76a299057668d795glennrp png_set_packing(ping); 2329faa852bad40107edae19405e76a299057668d795glennrp ping_bit_depth = 8; 2330faa852bad40107edae19405e76a299057668d795glennrp } 23313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2332faa852bad40107edae19405e76a299057668d795glennrp 2333faa852bad40107edae19405e76a299057668d795glennrp image->depth=ping_bit_depth; 23343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=GetImageQuantumDepth(image,MagickFalse); 2335faa852bad40107edae19405e76a299057668d795glennrp image->interlace=ping_interlace_method != 0 ? PNGInterlace : NoInterlace; 23363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 23373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2339e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " PNG width: %.20g, height: %.20g", 2340e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) ping_width, (double) ping_height); 23410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 23423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG color_type: %d, bit_depth: %d", 2344faa852bad40107edae19405e76a299057668d795glennrp ping_color_type, ping_bit_depth); 23450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 23463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG compression_method: %d", 2348faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method); 23490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 23503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG interlace_method: %d, filter_method: %d", 2352faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method,ping_filter_method); 23533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2355faa852bad40107edae19405e76a299057668d795glennrp#ifdef PNG_READ_iCCP_SUPPORTED 2356faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_iCCP)) 23573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 23593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 23603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2361e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 2362e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp png_charp 2363e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp info; 2364e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#else 2365e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp png_bytep 2366e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp info; 2367e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#endif 2368e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp 23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 23703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name; 23713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 23733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile_length; 23743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_iCCP(ping,ping_info,&name,(int *) &compression,&info, 23763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &profile_length); 23770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 23783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile_length != 0) 23793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 23813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 23823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 23843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG iCCP chunk."); 2386e8f8f3877ede9cbc125b64c8f760c7c4a63bc00fcristy profile=BlobToStringInfo(info,profile_length); 2387e8f8f3877ede9cbc125b64c8f760c7c4a63bc00fcristy if (profile == (StringInfo *) NULL) 2388edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2389edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, "ICC profile is NULL"); 2390edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp profile=DestroyStringInfo(profile); 2391edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2392edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp else 2393edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2394edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp (void) SetImageProfile(image,"icc",profile,exception); 2395edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp profile=DestroyStringInfo(profile); 2396edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 23973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sRGB_SUPPORTED) 24013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_global_srgb) 24032ea7a8e883de7623d345f32f90ee99248a4a867ecristy { 24042ea7a8e883de7623d345f32f90ee99248a4a867ecristy image->rendering_intent=Magick_RenderingIntent_from_PNG_RenderingIntent 24052ea7a8e883de7623d345f32f90ee99248a4a867ecristy (mng_info->global_srgb_intent); 24062ea7a8e883de7623d345f32f90ee99248a4a867ecristy } 24070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_sRGB(ping,ping_info,&intent)) 24093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2410cf002022280cc4dedb2748ad6f415aac1d44f530glennrp image->rendering_intent=Magick_RenderingIntent_from_PNG_RenderingIntent 2411cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (intent); 24120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2415e610a071534e448c46460a5aa39ede33bf56b329glennrp " Reading PNG sRGB chunk: rendering_intent: %d",intent); 24163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 24193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2420faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_gAMA(ping,ping_info,&file_gamma)) 2421faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_gama) 2422faa852bad40107edae19405e76a299057668d795glennrp png_set_gAMA(ping,ping_info,mng_info->global_gamma); 24230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_gAMA(ping,ping_info,&file_gamma)) 24253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gamma=(float) file_gamma; 24273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG gAMA chunk: gamma: %f",file_gamma); 24303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2432faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 2433faa852bad40107edae19405e76a299057668d795glennrp { 2434faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_chrm != MagickFalse) 2435faa852bad40107edae19405e76a299057668d795glennrp { 2436faa852bad40107edae19405e76a299057668d795glennrp (void) png_set_cHRM(ping,ping_info, 2437faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.x, 2438faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.y, 2439faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.x, 2440faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.y, 2441faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.x, 2442faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.y, 2443faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.x, 2444faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.y); 2445faa852bad40107edae19405e76a299057668d795glennrp } 2446faa852bad40107edae19405e76a299057668d795glennrp } 24470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2448faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_cHRM(ping,ping_info, 24513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.x, 24523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.y, 24533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.x, 24543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.y, 24553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.x, 24563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.y, 24573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.x, 24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.y); 24590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG cHRM chunk."); 24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2465e610a071534e448c46460a5aa39ede33bf56b329glennrp if (image->rendering_intent != UndefinedIntent) 24663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2467e610a071534e448c46460a5aa39ede33bf56b329glennrp png_set_sRGB(ping,ping_info, 2468cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent 2469cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (image->rendering_intent)); 2470da7803d6b1161960bc1e7db4d9718284c116fab8cristy png_set_gAMA(ping,ping_info,1.000f/2.200f); 2471faa852bad40107edae19405e76a299057668d795glennrp png_set_cHRM(ping,ping_info, 2472faa852bad40107edae19405e76a299057668d795glennrp 0.6400f, 0.3300f, 0.3000f, 0.6000f, 2473faa852bad40107edae19405e76a299057668d795glennrp 0.1500f, 0.0600f, 0.3127f, 0.3290f); 24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_oFFs_SUPPORTED) 2476faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 24773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2478905ef80dad2c83a01a607533f7039528ca7766b9cristy image->page.x=(ssize_t) png_get_x_offset_pixels(ping, ping_info); 2479905ef80dad2c83a01a607533f7039528ca7766b9cristy image->page.y=(ssize_t) png_get_y_offset_pixels(ping, ping_info); 24800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x || image->page.y) 24833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2484e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG oFFs chunk: x: %.20g, y: %.20g.",(double) 2485e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->page.x,(double) image->page.y); 24863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 24883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 2489faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 2490faa852bad40107edae19405e76a299057668d795glennrp { 2491faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_phys) 2492faa852bad40107edae19405e76a299057668d795glennrp { 2493faa852bad40107edae19405e76a299057668d795glennrp png_set_pHYs(ping,ping_info, 2494faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_x_pixels_per_unit, 2495faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_y_pixels_per_unit, 2496faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_phys_unit_type); 2497faa852bad40107edae19405e76a299057668d795glennrp } 2498faa852bad40107edae19405e76a299057668d795glennrp } 2499faa852bad40107edae19405e76a299057668d795glennrp 2500faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 25013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 25033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image resolution. 25043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 25053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_pHYs(ping,ping_info,&x_resolution,&y_resolution, 25060881b52ab4fee8427578a694081946c4c4e92b35cristy &unit_type); 250716ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) x_resolution; 250816ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) y_resolution; 25090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (unit_type == PNG_RESOLUTION_METER) 25113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 251316ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) x_resolution/100.0; 251416ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) y_resolution/100.0; 25153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 25183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2519e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 2520e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) x_resolution,(double) y_resolution,unit_type); 25213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2523823b55c200d7fc1818ab539b036a9c24feaecda8glennrp 2524faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 25253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 25273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 25283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 25293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 25303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 25313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 25323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 25330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((number_colors == 0) && 2535faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) 25363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte_length) 25383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_PLTE(ping,ping_info,mng_info->global_plte, 25403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int) mng_info->global_plte_length); 25410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2542faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 2543edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 25443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_trns_length) 25453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2546edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, 2547edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp "global tRNS has more entries than global PLTE"); 25483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2549edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp else 2550edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2551edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_set_tRNS(ping,ping_info,mng_info->global_trns, 2552edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp (int) mng_info->global_trns_length,NULL); 2553edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2554edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2555bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#ifdef PNG_READ_bKGD_SUPPORTED 25563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( 25573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 25583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index || 25593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2560faa852bad40107edae19405e76a299057668d795glennrp png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 25613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_16 25633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background; 25643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_saved_bkgd_index) 25673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.index=mng_info->saved_bkgd_index; 25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2569faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping, ping_info, PNG_INFO_bKGD)) 2570faa852bad40107edae19405e76a299057668d795glennrp background.index=ping_background->index; 25710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.red=(png_uint_16) 25733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].red; 25740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.green=(png_uint_16) 25763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].green; 25770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.blue=(png_uint_16) 25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].blue; 25800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2581c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp background.gray=(png_uint_16) 2582c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp mng_info->global_plte[background.index].green; 2583c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 25843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_bKGD(ping,ping_info,&background); 25853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2589edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"No global PLTE in file"); 25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2593bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#ifdef PNG_READ_bKGD_SUPPORTED 2594faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_bkgd && 2595faa852bad40107edae19405e76a299057668d795glennrp (!png_get_valid(ping,ping_info,PNG_INFO_bKGD))) 25963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_info->mng_global_bkgd; 25970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2598faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 25993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2600bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp unsigned int 2601bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale; 2602bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp 26033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 26043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image background color. 26053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 26063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 26073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 26083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG bKGD chunk."); 26090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2610bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp /* Scale background components to 16-bit, then scale 2611bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp * to quantum depth 2612bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp */ 2613bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (logging != MagickFalse) 2614bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2615bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp " raw ping_background=(%d,%d,%d).",ping_background->red, 2616bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->green,ping_background->blue); 26172cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2618bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 1; 26190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2620bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (ping_bit_depth == 1) 2621bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 255; 26220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2623bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp else if (ping_bit_depth == 2) 2624bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 85; 26250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2626bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp else if (ping_bit_depth == 4) 2627bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 17; 26280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2629bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (ping_bit_depth <= 8) 2630bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale *= 257; 26312cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2632bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->red *= bkgd_scale; 2633bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->green *= bkgd_scale; 2634bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->blue *= bkgd_scale; 26352cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2636bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (logging != MagickFalse) 2637bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp { 26382cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 26392cbb4489df0a2a31907769956f217d4b9d982bd0glennrp " bkgd_scale=%d.",bkgd_scale); 26400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 26412cbb4489df0a2a31907769956f217d4b9d982bd0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 26422cbb4489df0a2a31907769956f217d4b9d982bd0glennrp " ping_background=(%d,%d,%d).",ping_background->red, 26432cbb4489df0a2a31907769956f217d4b9d982bd0glennrp ping_background->green,ping_background->blue); 2644bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp } 26452cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2646bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.red= 2647faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->red); 26480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2649bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.green= 2650faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->green); 26510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2652bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.blue= 2653bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ScaleShortToQuantum(ping_background->blue); 26540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 265516ea139d53d867211d3bb0fa859a83de653f687ecristy image->background_color.alpha=OpaqueAlpha; 26562cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2657bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (logging != MagickFalse) 2658bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2659bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp " image->background_color=(%.20g,%.20g,%.20g).", 2660bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.red, 2661bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.green, 2662bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.blue); 26633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2664bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#endif /* PNG_READ_bKGD_SUPPORTED */ 2665a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2666faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 26673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2669a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp Image has a tRNS chunk. 26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy max_sample; 26733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 267435ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 267535ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 267635ef824baa82511126ff0072ae30eee0da9c05a3cristy 26773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 26783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 26793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG tRNS chunk."); 26803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2681f9cca6af1ff9b913c32a2cec81eda059877a8832cristy max_sample = (int) ((one << ping_bit_depth) - 1); 26823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2683faa852bad40107edae19405e76a299057668d795glennrp if ((ping_color_type == PNG_COLOR_TYPE_GRAY && 2684faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->gray > max_sample) || 2685faa852bad40107edae19405e76a299057668d795glennrp (ping_color_type == PNG_COLOR_TYPE_RGB && 2686faa852bad40107edae19405e76a299057668d795glennrp ((int)ping_trans_color->red > max_sample || 2687faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->green > max_sample || 2688faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->blue > max_sample))) 26893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 26913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 26923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Ignoring PNG tRNS chunk with out-of-range sample."); 26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free_data(ping, ping_info, PNG_FREE_TRNS, 0); 2694faa852bad40107edae19405e76a299057668d795glennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 26983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2699a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp int 2700a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp scale_to_short; 2701a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2702a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp scale_to_short = 65535L/((1UL << ping_bit_depth)-1); 2703a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2704a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp /* Scale transparent_color to short */ 2705a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.red= scale_to_short*ping_trans_color->red; 2706a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.green= scale_to_short*ping_trans_color->green; 2707a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.blue= scale_to_short*ping_trans_color->blue; 270816ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha= scale_to_short*ping_trans_color->gray; 270905eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp 2710faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 27113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27120f111984738842d27d04aed2a3f823d82a943506glennrp if (logging != MagickFalse) 27130f111984738842d27d04aed2a3f823d82a943506glennrp { 27140f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 27150f111984738842d27d04aed2a3f823d82a943506glennrp " Raw tRNS graylevel is %d.",ping_trans_color->gray); 27160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27170f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 271816ea139d53d867211d3bb0fa859a83de653f687ecristy " scaled graylevel is %.20g.",transparent_color.alpha); 27190f111984738842d27d04aed2a3f823d82a943506glennrp } 272016ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red=transparent_color.alpha; 272116ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green=transparent_color.alpha; 272216ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue=transparent_color.alpha; 27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sBIT_SUPPORTED) 27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_global_sbit) 27283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2729faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_sBIT)) 27303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sBIT(ping,ping_info,&mng_info->global_sbit); 27313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 2734faa852bad40107edae19405e76a299057668d795glennrp 27353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_update_info(ping,ping_info); 2736faa852bad40107edae19405e76a299057668d795glennrp 2737faa852bad40107edae19405e76a299057668d795glennrp ping_rowbytes=png_get_rowbytes(ping,ping_info); 2738faa852bad40107edae19405e76a299057668d795glennrp 27393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 27403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image structure. 27413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 27423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.left=0; 2743bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.right=(ssize_t) ping_width; 27443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.top=0; 2745bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.bottom=(ssize_t) ping_height; 27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2748faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_width=ping_width; 2749faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_height=ping_height; 27503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame=mng_info->image_box; 27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_info->image_box; 27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[mng_info->object_id]; 27573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->compression=ZipCompression; 2760faa852bad40107edae19405e76a299057668d795glennrp image->columns=ping_width; 2761faa852bad40107edae19405e76a299057668d795glennrp image->rows=ping_height; 2762a6c5d34901e480ed05ae3d7be9b4725d6e5ea246glennrp 276316ea139d53d867211d3bb0fa859a83de653f687ecristy if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 276416ea139d53d867211d3bb0fa859a83de653f687ecristy ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) 27658d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp { 27668d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_gAMA) && 27678d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp !png_get_valid(ping,ping_info,PNG_INFO_cHRM) && 27688d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp !png_get_valid(ping,ping_info,PNG_INFO_sRGB)) 27698d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp { 27708d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp /* Set image->gamma to 1.0, image->rendering_intent to Undefined, 27718d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp * and reset image->chromaticity. 27728d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp */ 27738d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp SetImageColorspace(image,GRAYColorspace,exception); 27748d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp } 27758d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp 27768d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp else 27778d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp { 27788d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp /* Use colorspace data from PNG ancillary chunks */ 27798d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp image->colorspace=GRAYColorspace; 27808d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp } 27818d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp } 2782a6c5d34901e480ed05ae3d7be9b4725d6e5ea246glennrp 2783faa852bad40107edae19405e76a299057668d795glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 2784faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY)) 27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2786befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 2787befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 2788befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 27893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=PseudoClass; 2790befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 2791befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy image->colors=one << ping_bit_depth; 27923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 8) 27933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 256) 279467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colors=256; 279567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#else 279667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->colors > 65536L) 279767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colors=65536L; 27983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2799faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 28003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 28023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 28033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 28053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 28063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 2808bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->colors=(size_t) number_colors; 28090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 28113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG PLTE chunk: number_colors: %d.",number_colors); 28133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 28173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 28193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image colormap. 28203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 282116ea139d53d867211d3bb0fa859a83de653f687ecristy if (AcquireImageColormap(image,image->colors,exception) == MagickFalse) 2822edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 28230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2824faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 28253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 28273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 28283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 28303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 28313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 28323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 28330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28346af6cf1a950b111ad0ac706269a703086693ba71glennrp for (i=0; i < (ssize_t) number_colors; i++) 28353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleCharToQuantum(palette[i].red); 28373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleCharToQuantum(palette[i].green); 28383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleCharToQuantum(palette[i].blue); 28393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28406af6cf1a950b111ad0ac706269a703086693ba71glennrp 284167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp for ( ; i < (ssize_t) image->colors; i++) 28426af6cf1a950b111ad0ac706269a703086693ba71glennrp { 28436af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].red=0; 28446af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].green=0; 28456af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].blue=0; 28466af6cf1a950b111ad0ac706269a703086693ba71glennrp } 28473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 28503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2851bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 28523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scale; 28533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2854faa852bad40107edae19405e76a299057668d795glennrp scale=(QuantumRange/((1UL << ping_bit_depth)-1)); 28550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scale < 1) 28573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scale=1; 28580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2859bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 28603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=(Quantum) (i*scale); 28623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=(Quantum) (i*scale); 28633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=(Quantum) (i*scale); 28643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2867147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 2868cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* Set some properties for reporting by "identify" */ 2869cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 2870147bc91f6859c598c4f57b6a162111b2f63614d9glennrp char 2871147bc91f6859c598c4f57b6a162111b2f63614d9glennrp msg[MaxTextExtent]; 2872147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 2873147bc91f6859c598c4f57b6a162111b2f63614d9glennrp /* encode ping_width, ping_height, ping_bit_depth, ping_color_type, 2874147bc91f6859c598c4f57b6a162111b2f63614d9glennrp ping_interlace_method in value */ 2875147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 28763b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 28777cdb11cd177ff29a9d2d8503ad4c920b404eade4glennrp "%d, %d",(int) ping_width, (int) ping_height); 287816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:IHDR.width,height ",msg,exception); 2879147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 28803b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"%d",(int) ping_bit_depth); 288116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:IHDR.bit_depth ",msg,exception); 2882147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 28835dff435eceea4f80207a906b11e65aed48fe3f27glennrp (void) FormatLocaleString(msg,MaxTextExtent,"%d (%s)", 28845dff435eceea4f80207a906b11e65aed48fe3f27glennrp (int) ping_color_type, 28855dff435eceea4f80207a906b11e65aed48fe3f27glennrp Magick_ColorType_from_PNG_ColorType((int)ping_color_type)); 288616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:IHDR.color_type ",msg,exception); 2887147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 28883b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"%d", 2889147bc91f6859c598c4f57b6a162111b2f63614d9glennrp (int) ping_interlace_method); 289016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:IHDR.interlace_method",msg,exception); 2891cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 2892147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 28933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 28943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image scanlines. 28953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 28963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay != 0) 28973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found++; 28980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28990ca69b143ae83fb90449a01e0b0900cb83a1cbc8glennrp if ((mng_info->mng_type == 0 && (image->ping != MagickFalse)) || ( 2900347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->number_scenes != 0) && (mng_info->scenes_found > (ssize_t) 2901347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->first_scene+image_info->number_scenes)))) 29023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29031b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp /* This happens later in non-ping decodes */ 29041b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 29051b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp image->storage_class=DirectClass; 29061b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp 29073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2909e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping PNG image data for scene %.20g",(double) 29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found-1); 29113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 2912edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2913edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 2914cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2916edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 29173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()."); 29200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 29263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG IDAT chunk(s)"); 29270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 2929cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) AcquireQuantumMemory(image->rows, 2930cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_rowbytes*sizeof(*ping_pixels)); 29310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2933cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) AcquireQuantumMemory(ping_rowbytes, 2934cf002022280cc4dedb2748ad6f415aac1d44f530glennrp sizeof(*ping_pixels)); 29350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2936cf002022280cc4dedb2748ad6f415aac1d44f530glennrp if (ping_pixels == (unsigned char *) NULL) 2937edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 29380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 29403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 29413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Converting PNG pixels to pixel packets"); 29423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 29433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PNG pixels to pixel packets. 29443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 294516ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info=AcquireQuantumInfo(image_info,image); 294616ea139d53d867211d3bb0fa859a83de653f687ecristy 294716ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info == (QuantumInfo *) NULL) 2948edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Failed to allocate quantum_info"); 29490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2950c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 2951c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 2952c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp MagickBooleanType 2953c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel; 2954c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 2955c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel=MagickFalse; 2956c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 29573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 29583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2959c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (pass=0; pass < num_passes; pass++) 2960c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 2961c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* 2962c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp Convert image to DirectClass pixel packets. 2963c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp */ 296467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 296567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp int 296667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp depth; 296767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp 296867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp depth=(ssize_t) ping_bit_depth; 296967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#endif 2970c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 2971c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 2972c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 2973c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp MagickTrue : MagickFalse; 29740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2975c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (y=0; y < (ssize_t) image->rows; y++) 2976c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 2977c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (num_passes > 1) 2978c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=ping_rowbytes*y; 29790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2980c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 2981c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=0; 29820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2983cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 2984862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 298616ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 2987c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 29880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 298916ea139d53d867211d3bb0fa859a83de653f687ecristy if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY) 299016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 299116ea139d53d867211d3bb0fa859a83de653f687ecristy GrayQuantum,ping_pixels+row_offset,exception); 29920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 299316ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 299416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 299516ea139d53d867211d3bb0fa859a83de653f687ecristy GrayAlphaQuantum,ping_pixels+row_offset,exception); 29960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 299716ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 299816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 299916ea139d53d867211d3bb0fa859a83de653f687ecristy RGBAQuantum,ping_pixels+row_offset,exception); 30000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 300116ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 300216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 300316ea139d53d867211d3bb0fa859a83de653f687ecristy IndexQuantum,ping_pixels+row_offset,exception); 30040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 300516ea139d53d867211d3bb0fa859a83de653f687ecristy else /* ping_color_type == PNG_COLOR_TYPE_RGB */ 300616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 300716ea139d53d867211d3bb0fa859a83de653f687ecristy RGBQuantum,ping_pixels+row_offset,exception); 30083faa9a3fb01696daaf976d595f492cb530bffb21glennrp 3009c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel == MagickFalse) 3010c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3011c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* Is there a transparent pixel in the row? */ 3012a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (y== 0 && logging != MagickFalse) 3013a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3014a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Looking for cheap transparent pixel"); 3015a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3016c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 3017c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 30185aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if ((ping_color_type == PNG_COLOR_TYPE_RGBA || 30195aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && 302016ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,q) != OpaqueAlpha)) 3021c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3022a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3023a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3024a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 3025a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3026c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel = MagickTrue; 3027c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3028c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 30294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((ping_color_type == PNG_COLOR_TYPE_RGB || 30304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_color_type == PNG_COLOR_TYPE_GRAY) && 303116ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToShort(GetPixelRed(image,q)) == 303216ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 303316ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 303416ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 303516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 303616ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue)) 30374f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 3038a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3039a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3040a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 30414f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp found_transparent_pixel = MagickTrue; 30424f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 30434f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 304416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 3045c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3046c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 30470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3048c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if ((image->previous == (Image *) NULL) && (num_passes == 1)) 3049c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3050c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 3051c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp image->rows); 30520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3053c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (status == MagickFalse) 3054c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3055c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3056c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 3057c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3058c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 30590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3060c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if ((image->previous == (Image *) NULL) && (num_passes != 1)) 30617a287bfadeadea12e47c2376ca78a5d101687142cristy { 3062c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp status=SetImageProgress(image,LoadImageTag,pass,num_passes); 30637a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 30647a287bfadeadea12e47c2376ca78a5d101687142cristy break; 30657a287bfadeadea12e47c2376ca78a5d101687142cristy } 30663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* image->storage_class != DirectClass */ 3070c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 30713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 30723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Quantum 30743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_scanline; 30753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register Quantum 30773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 30783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert grayscale image to PseudoClass pixel packets. 30813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3082c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (logging != MagickFalse) 3083c17d96f447438bb27d874f1440ed05f6493fde1fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3084c17d96f447438bb27d874f1440ed05f6493fde1fglennrp " Converting grayscale pixels to pixel packets"); 308516ea139d53d867211d3bb0fa859a83de653f687ecristy 3086faa852bad40107edae19405e76a299057668d795glennrp image->matte=ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ? 30873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickTrue : MagickFalse; 30880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) AcquireQuantumMemory(image->columns, 30903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->matte ? 2 : 1)*sizeof(*quantum_scanline)); 30910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_scanline == (Quantum *) NULL) 3093edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 30940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3095bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 30963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 3098faa852bad40107edae19405e76a299057668d795glennrp row_offset=ping_rowbytes*y; 3099c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 31003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 31013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset=0; 3102c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3103cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 31043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 31050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 310616ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 31073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 31080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3109cf002022280cc4dedb2748ad6f415aac1d44f530glennrp p=ping_pixels+row_offset; 31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 3111c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3112faa852bad40107edae19405e76a299057668d795glennrp switch (ping_bit_depth) 31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 1: 31153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3116bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 31173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bit; 31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3119bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-7; x > 0; x-=8) 31203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (bit=7; bit >= 0; bit--) 3122a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(Quantum) ((*p) & (0x01 << bit) ? 0x01 : 0x00); 31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; 31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 8) != 0) 31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3128bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (bit=7; bit >= (ssize_t) (8-(image->columns % 8)); bit--) 3129a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(Quantum) ((*p) & (0x01 << bit) ? 0x01 : 0x00); 31303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 313447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 2: 31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3137bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-3; x > 0; x-=4) 31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3139a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p >> 6) & 0x03; 3140a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p >> 4) & 0x03; 3141a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p >> 2) & 0x03; 3142a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p++) & 0x03; 31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 4) != 0) 31463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3147bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=3; i >= (ssize_t) (4-(image->columns % 4)); i--) 3148a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(Quantum) ((*p >> (i*2)) & 0x03); 31493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 31523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 315347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 31543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 4: 31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3156bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x > 0; x-=2) 31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3158a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p >> 4) & 0x0f; 3159a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p++) & 0x0f; 31603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns % 2) != 0) 3163a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=(*p++ >> 4) & 0x0f; 31640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 316747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 31693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3170faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 3171bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 31723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3173a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 317416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleCharToQuantum((unsigned char) *p++),q); 317516ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 31760b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 317716ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 31783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3181bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3182a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 31830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 31853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 318647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 31873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 31883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3189bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3190a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp { 3191c17d96f447438bb27d874f1440ed05f6493fde1fglennrp#if (MAGICKCORE_QUANTUM_DEPTH == 16) || (MAGICKCORE_QUANTUM_DEPTH == 32) 319258f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp size_t 319358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum; 319458f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 319558f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (image->colors > 256) 3196c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 319758f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 319858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp else 3199c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 320058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 320158f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum|=(*p++); 3202c17d96f447438bb27d874f1440ed05f6493fde1fglennrp *r=ScaleShortToQuantum(quantum); 320358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp r++; 32040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3205faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 32063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3207c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (image->colors > 256) 3208c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 3209c17d96f447438bb27d874f1440ed05f6493fde1fglennrp else 3210c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 3211c17d96f447438bb27d874f1440ed05f6493fde1fglennrp 3212c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum|=(*p++); 321316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleShortToQuantum(quantum),q); 321416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 321558f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp found_transparent_pixel = MagickTrue; 321616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 321758f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp } 321858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 321958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp#else /* MAGICKCORE_QUANTUM_DEPTH == 8 */ 322058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp *r++=(*p++); 322158f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; /* strip low byte */ 322247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 322358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (ping_color_type == 4) 322458f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp { 322516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,*p++,q); 322616ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 32270b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 322858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; 322916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 32303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3232a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp } 323347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 32343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 32353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 323647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 32373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 32383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 32393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32403faa9a3fb01696daaf976d595f492cb530bffb21glennrp 32413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 32423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Transfer image scanline. 32433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 32443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 32450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 324616ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 324716ea139d53d867211d3bb0fa859a83de653f687ecristy 324816ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 324916ea139d53d867211d3bb0fa859a83de653f687ecristy break; 3250bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 325116ea139d53d867211d3bb0fa859a83de653f687ecristy { 325216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,*r++,q); 325316ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 325416ea139d53d867211d3bb0fa859a83de653f687ecristy } 32550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 32563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 32573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 32580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 32597a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes == 1)) 32607a287bfadeadea12e47c2376ca78a5d101687142cristy { 3261cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 32629fff7b4fa7d657da7bfed66239982b85c6337de9cristy image->rows); 326347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 32647a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 32657a287bfadeadea12e47c2376ca78a5d101687142cristy break; 32667a287bfadeadea12e47c2376ca78a5d101687142cristy } 32673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3268c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 32697a287bfadeadea12e47c2376ca78a5d101687142cristy if ((image->previous == (Image *) NULL) && (num_passes != 1)) 32703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 32713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 327247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 32733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 32743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 32753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3276c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 32773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); 32783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3279c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3280c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp image->matte=found_transparent_pixel; 3281c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3282c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 3283c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3284c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel != MagickFalse) 3285c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3286c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Found transparent pixel"); 3287c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 32885aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 32895aa37f69df93407ddf94afdfd2504f708d8b3242glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 32905aa37f69df93407ddf94afdfd2504f708d8b3242glennrp " No transparent pixel was found"); 3291bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 32925aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type&=0x03; 32935aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 3294c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3295c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3296c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 329716ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info != (QuantumInfo *) NULL) 329816ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info=DestroyQuantumInfo(quantum_info); 329916ea139d53d867211d3bb0fa859a83de653f687ecristy 33005c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (image->storage_class == PseudoClass) 33015c6f789db7a30bad01ace12b09ad9cd471339e94cristy { 3302aeb2cbc4eb61cc6a04744db1dc52f5319c466e29cristy MagickBooleanType 33035c6f789db7a30bad01ace12b09ad9cd471339e94cristy matte; 33045c6f789db7a30bad01ace12b09ad9cd471339e94cristy 33055c6f789db7a30bad01ace12b09ad9cd471339e94cristy matte=image->matte; 33065c6f789db7a30bad01ace12b09ad9cd471339e94cristy image->matte=MagickFalse; 330716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 3308aeb2cbc4eb61cc6a04744db1dc52f5319c466e29cristy image->matte=matte; 33095c6f789db7a30bad01ace12b09ad9cd471339e94cristy } 331047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 33114eb3931feb349dd87142c78503b779228f3e1a0fglennrp png_read_end(ping,end_info); 33123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0 && mng_info->scenes_found-1 < 3314bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) image_info->first_scene && image->delay != 0) 33153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 3317cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) RelinquishMagickMemory(ping_pixels); 33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 331916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 3320edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 3321cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 33233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 33243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 33253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() early."); 33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 33273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 332847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3329faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ClassType 33323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class; 33333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 33353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image has a transparent background. 33363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class=image->storage_class; 33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickTrue; 3339c11cf6a442f3046940608a5743a68cc891deb13eglennrp 33403c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp/* Balfour fix from imagemagick discourse server, 5 Feb 2010 */ 3341c11cf6a442f3046940608a5743a68cc891deb13eglennrp 33420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (storage_class == PseudoClass) 33430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 33440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 3345c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 33460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < ping_num_trans; x++) 33470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 334816ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].matte=MagickTrue; 334916ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = 335016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((unsigned char)ping_trans_alpha[x]); 33510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3352c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 335347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 33540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY) 33550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 33560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < (int) image->colors; x++) 33570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 33580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ScaleQuantumToShort(image->colormap[x].red) == 335916ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha) 33600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 336116ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].matte=MagickTrue; 336216ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = (Quantum) TransparentAlpha; 33630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 33640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 33650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 336616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 33670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 336847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3369a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if 1 /* Should have already been done above, but glennrp problem P10 3370a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * needs this. 3371a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 33720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 33730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 33740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (y=0; y < (ssize_t) image->rows; y++) 33750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 33760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->storage_class=storage_class; 33770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 3378c11cf6a442f3046940608a5743a68cc891deb13eglennrp 337916ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 33800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3381c11cf6a442f3046940608a5743a68cc891deb13eglennrp 33820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3383a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp /* Caution: on a Q8 build, this does not distinguish between 3384a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * 16-bit colors that differ only in the low byte 3385a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 33860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 33870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 338816ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToShort(GetPixelRed(image,q)) == 338916ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 339016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 339116ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 339216ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 339316ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue) 33944f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 339516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,q); 33964f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 33970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 339867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if 0 /* I have not found a case where this is needed. */ 33990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 34004f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 340116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,q)=(Quantum) OpaqueAlpha; 34024f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 3403a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 34040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 340516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 34060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 34070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 34090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3410c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 34110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3412a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 3413c11cf6a442f3046940608a5743a68cc891deb13eglennrp 34143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=DirectClass; 34153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34163c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 3417eb3b22a03f31af7f724573d8537cd91fca06ee41cristy for (j = 0; j < 2; j++) 34184eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 34194eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (j == 0) 3420a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,ping_info,&text,&num_text) != 0 ? 3421a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 34224eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 3423a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,end_info,&text,&num_text) != 0 ? 3424a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34264eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (status != MagickFalse) 34274eb3931feb349dd87142c78503b779228f3e1a0fglennrp for (i=0; i < (ssize_t) num_text; i++) 34284eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 34294eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Check for a profile */ 34300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34314eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 34324eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34334eb3931feb349dd87142c78503b779228f3e1a0fglennrp " Reading PNG text chunk"); 34340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34354eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (memcmp(text[i].key, "Raw profile type ",17) == 0) 34364eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3437edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp (void) Magick_png_read_raw_profile(ping,image,image_info,text, 3438edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp (int) i,exception); 34394eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_raw_profiles++; 34404eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 34414eb3931feb349dd87142c78503b779228f3e1a0fglennrp 34424eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 34434eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 34444eb3931feb349dd87142c78503b779228f3e1a0fglennrp char 34454eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value; 34464eb3931feb349dd87142c78503b779228f3e1a0fglennrp 34474eb3931feb349dd87142c78503b779228f3e1a0fglennrp length=text[i].text_length; 34484eb3931feb349dd87142c78503b779228f3e1a0fglennrp value=(char *) AcquireQuantumMemory(length+MaxTextExtent, 34494eb3931feb349dd87142c78503b779228f3e1a0fglennrp sizeof(*value)); 34504eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (value == (char *) NULL) 34514eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3452edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 34534eb3931feb349dd87142c78503b779228f3e1a0fglennrp break; 34544eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 34554eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value='\0'; 34564eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) ConcatenateMagickString(value,text[i].text,length+2); 34574eb3931feb349dd87142c78503b779228f3e1a0fglennrp 34584eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Don't save "density" or "units" property if we have a pHYs 34594eb3931feb349dd87142c78503b779228f3e1a0fglennrp * chunk 34604eb3931feb349dd87142c78503b779228f3e1a0fglennrp */ 34614eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs) || 34624eb3931feb349dd87142c78503b779228f3e1a0fglennrp (LocaleCompare(text[i].key,"density") != 0 && 34634eb3931feb349dd87142c78503b779228f3e1a0fglennrp LocaleCompare(text[i].key,"units") != 0)) 346416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,text[i].key,value,exception); 34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 34664eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 34673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34684eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34694eb3931feb349dd87142c78503b779228f3e1a0fglennrp " length: %lu",(unsigned long) length); 34704eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34714eb3931feb349dd87142c78503b779228f3e1a0fglennrp " Keyword: %s",text[i].key); 34723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34744eb3931feb349dd87142c78503b779228f3e1a0fglennrp value=DestroyString(value); 347597f90e23c85b9c58387880125c29d8c99126f83aglennrp } 34764eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 34774eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_text_total += num_text; 34783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34793c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 34803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 34813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 34823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Store the object if necessary. 34833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 34843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id && !mng_info->frozen[object_id]) 34853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 34873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 34893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy create a new object buffer. 34903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 34913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]=(MngBuffer *) 349273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(MngBuffer)); 34930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] != (MngBuffer *) NULL) 34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=(Image *) NULL; 34973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->reference_count=1; 34983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 350047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 35013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->ob[object_id] == (MngBuffer *) NULL) || 35023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->frozen) 35033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 3505edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 35060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->frozen) 3508edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Cannot overwrite frozen MNG object buffer"); 35093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 35123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=DestroyImage 35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->ob[object_id]->image); 35170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=CloneImage(image,0,0,MagickTrue, 351916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 35200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image->file=(FILE *) NULL; 35230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3525edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cloning image for object buffer failed"); 35260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3527faa852bad40107edae19405e76a299057668d795glennrp if (ping_width > 250000L || ping_height > 250000L) 35283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping,"PNG Image dimensions are too large."); 35290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3530faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->width=ping_width; 3531faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->height=ping_height; 3532faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->color_type=ping_color_type; 3533faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->sample_depth=ping_bit_depth; 3534faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->interlace_method=ping_interlace_method; 3535faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->compression_method= 3536faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method; 3537faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->filter_method=ping_filter_method; 35380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3539faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 35403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 35423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy number_colors; 35433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 35453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte; 35463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy the PLTE to the object buffer. 35493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_get_PLTE(ping,ping_info,&plte,&number_colors); 35513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=number_colors; 35523c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 35533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 35543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte[i]=plte[i]; 35563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 355847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 35593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 35603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=0; 35613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 35633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 35640a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 35650a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp /* Set image->matte to MagickTrue if the input colortype supports 35660a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * alpha or if a valid tRNS chunk is present, no matter whether there 35670a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * is actual transparency present. 35680a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp */ 35690a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp image->matte=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 35700a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 35710a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 35720a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp MagickTrue : MagickFalse; 35730a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 3574cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* Set more properties for identify to retrieve */ 3575cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3576cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp char 3577cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp msg[MaxTextExtent]; 3578cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 35794eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (num_text_total != 0) 3580cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3581cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* libpng doesn't tell us whether they were tEXt, zTXt, or iTXt */ 35823b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 3583613276d97a7f0e40c1055f9ff5ddfcfa8896e20bglennrp "%d tEXt/zTXt/iTXt chunks were found", num_text_total); 358416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:text ",msg, 358516ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3586cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3587cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3588cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (num_raw_profiles != 0) 3589cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 35903b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 3591cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp "%d were found", num_raw_profiles); 359216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:text-encoded profiles",msg, 359316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3594cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3595cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3596cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 35975961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 35983b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"%s", 35995961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Chromaticity, above)"); 360016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:cHRM ",msg, 360116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36025961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 3603cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3604cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 36055961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 36063b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"%s", 36075961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Background color, above)"); 360816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:bKGD ",msg, 360916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36105961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 36115961225e531a5f26ae179c1d919582d5cdaa44bbglennrp 36123b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"%s", 36135961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found"); 3614cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3615cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_iCCP)) 361616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:iCCP ",msg, 361716ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3618cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 36194eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 362016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:tRNS ",msg, 362116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36224eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36234eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_sRGB_SUPPORTED) 3624cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_sRGB)) 36254eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36263b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 362716ea139d53d867211d3bb0fa859a83de653f687ecristy "intent=%d (See Rendering intent)", (int) intent); 362816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:sRGB ",msg, 362916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36304eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36314eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 36324eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36334eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_gAMA)) 36344eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36353b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 363616ea139d53d867211d3bb0fa859a83de653f687ecristy "gamma=%.8g (See Gamma, above)", 363716ea139d53d867211d3bb0fa859a83de653f687ecristy file_gamma); 363816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:gAMA ",msg, 363916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36404eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 3641cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 36424eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_pHYs_SUPPORTED) 3643cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 36444eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36453b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 364607523c7d2e40370804c2036295571e4b6426f94dglennrp "x_res=%.10g, y_res=%.10g, units=%d", 36474eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) x_resolution,(double) y_resolution, unit_type); 364816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:pHYs ",msg, 364916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36504eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36514eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 3652cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 36534eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_oFFs_SUPPORTED) 36544eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 36554eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36563b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent,"x_off=%.20g, y_off=%.20g", 36574eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) image->page.x,(double) image->page.y); 365816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:oFFs ",msg, 365916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 36604eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36614eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 36624eb3931feb349dd87142c78503b779228f3e1a0fglennrp 366307523c7d2e40370804c2036295571e4b6426f94dglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 366407523c7d2e40370804c2036295571e4b6426f94dglennrp (image->page.height != 0 && image->page.height != image->rows)) 366507523c7d2e40370804c2036295571e4b6426f94dglennrp { 36663b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(msg,MaxTextExtent, 366707523c7d2e40370804c2036295571e4b6426f94dglennrp "width=%.20g, height=%.20g", 366807523c7d2e40370804c2036295571e4b6426f94dglennrp (double) image->page.width,(double) image->page.height); 366916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:vpAg ",msg, 367016ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 367107523c7d2e40370804c2036295571e4b6426f94dglennrp } 3672cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3673cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 36753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 36763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 36773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 36783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3679cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) RelinquishMagickMemory(ping_pixels); 36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 36823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()"); 36840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3685edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 3686edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 3687edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 3688edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 3689edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block, revert to 3690edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 3691edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 3692edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* end of reading one PNG image */ 36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 37003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 370521f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 370621f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 372347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 37253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 372747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 3730fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadPNGImage()"); 373116ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 373447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(FileOpenError,"UnableToOpenFile"); 373747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify PNG signature. 37403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,8,(unsigned char *) magic_number); 374247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3743dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp if (count < 8 || memcmp(magic_number,"\211PNG\r\n\032\n",8) != 0) 37443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 374547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 375073bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 375147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 375447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 376547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (previous != (Image *) NULL) 37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (previous->signature != MagickSignature) 37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 37720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 37783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 37793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error"); 37800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 37823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 378347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 378547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns == 0) || (image->rows == 0)) 37873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 37893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 37903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error."); 37910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 37933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 379447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"PNG24") == 0) 37963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 379716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorType,exception); 37983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 37993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 38000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 38013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"PNG32") == 0) 380216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorMatteType,exception); 38030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 38043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 380597f90e23c85b9c58387880125c29d8c99126f83aglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 380697f90e23c85b9c58387880125c29d8c99126f83aglennrp " page.w: %.20g, page.h: %.20g,page.x: %.20g, page.y: %.20g.", 380797f90e23c85b9c58387880125c29d8c99126f83aglennrp (double) image->page.width,(double) image->page.height, 380897f90e23c85b9c58387880125c29d8c99126f83aglennrp (double) image->page.x,(double) image->page.y); 380997f90e23c85b9c58387880125c29d8c99126f83aglennrp 381097f90e23c85b9c58387880125c29d8c99126f83aglennrp if (logging != MagickFalse) 38113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadPNGImage()"); 38120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 38133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 38143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 38153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 38193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 38203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e J N G I m a g e % 38253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 38283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 38293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOneJNGImage() reads a JPEG Network Graphics (JNG) image file 38313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 38323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 38333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 38343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 38363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOneJNGImage method is: 38383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOneJNGImage(MngInfo *mng_info, const ImageInfo *image_info, 38403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 38413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 38433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 38453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 38473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 38493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 38503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 38513ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneJNGImage(MngInfo *mng_info, 38523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 38533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 38543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 38553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image, 38563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image, 38573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 38583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jng_image; 38593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 38613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image_info, 38623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image_info; 38633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38644383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 38654383ec8c3c8811128f5a8a034d67c47db5e7e75acristy logging; 38664383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 3867bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 38683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 38693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 38713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 38723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 38743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height, 38753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width; 38763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 38783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 38793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth, 38803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method, 38813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method, 38823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 38833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 38843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method, 38853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method; 38863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 388716ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 38883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *s; 38893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3890bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 38913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 38923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 38933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 389416ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 38953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 38963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 38973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 38983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 38993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 39013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP, 39023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat, 39033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 39043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3905bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 39063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 39073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=0; 39093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 39103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=0; 39113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height=0; 39123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width=0; 39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=(Image *) NULL; 39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=(Image *) NULL; 39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) NULL; 39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=(ImageInfo *) NULL; 39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 3919fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter ReadOneJNGImage()"); 39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 39220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 392316ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 39273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " AcquireNextImage()"); 39310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 393216ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 39330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 39360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 39403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Signature bytes have already been read. 39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickFalse; 39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickFalse; 39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (;;) 39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[MaxTextExtent]; 39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new JNG chunk. 39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 39640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 39670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 39693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(type,"errr",MaxTextExtent); 39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(unsigned int) ReadBlob(image,4,(unsigned char *) type); 39723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3975e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading JNG chunk type %c%c%c%c, length: %.20g", 3976e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX || count == 0) 39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 39800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 398347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 39870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 39893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 39900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3991bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 39923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 39930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 399647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 400347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 16) 40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4011bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 4013bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=p[8]; 40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth=p[9]; 40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method=p[10]; 40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method=p[11]; 401947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->interlace=jng_image_interlace_method != 0 ? PNGInterlace : 40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NoInterlace; 402247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=p[12]; 40243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=p[13]; 40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method=p[14]; 40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method=p[15]; 402747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4031f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " jng_width: %16lu",(unsigned long) jng_width); 403247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4034f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " jng_width: %16lu",(unsigned long) jng_height); 403547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_color_type: %16d",jng_color_type); 403847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_sample_depth: %3d", 40413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth); 404247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_compression_method:%3d", 40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method); 404647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_interlace_method: %3d", 40493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method); 405047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_sample_depth: %3d", 40533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth); 405447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_compression_method:%3d", 40573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method); 405847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_filter_method: %3d", 40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method); 406247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_interlace_method: %3d", 40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method); 40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 406847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 407147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 40743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((reading_idat == MagickFalse) && (read_JSEP == MagickFalse) && 40773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((memcmp(type,mng_JDAT,4) == 0) || (memcmp(type,mng_JdAA,4) == 0) || 40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (memcmp(type,mng_IDAT,4) == 0) || (memcmp(type,mng_JDAA,4) == 0))) 40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o create color_image 40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o open color_blob, attached to color_image 40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color type has alpha) 40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy open alpha_blob, attached to alpha_image 40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 408773bd4a51b419e914565bdf204bf1540dc4c8ee26cristy color_image_info=(ImageInfo *)AcquireMagickMemory(sizeof(ImageInfo)); 408847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image_info == (ImageInfo *) NULL) 40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 409147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(color_image_info); 409316ea139d53d867211d3bb0fa859a83de653f687ecristy color_image=AcquireImage(color_image_info,exception); 40940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image == (Image *) NULL) 40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating color_blob."); 41010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(color_image->filename); 41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(color_image_info,color_image,WriteBinaryBlobMode, 41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 41050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping == MagickFalse) && (jng_color_type >= 12)) 41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) 411273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(ImageInfo)); 41130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image_info == (ImageInfo *) NULL) 41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 41160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(alpha_image_info); 411816ea139d53d867211d3bb0fa859a83de653f687ecristy alpha_image=AcquireImage(alpha_image_info,exception); 41190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image == (Image *) NULL) 41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating alpha_blob."); 41300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(alpha_image->filename); 41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(alpha_image_info,alpha_image,WriteBinaryBlobMode, 41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 41340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 41370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[18]; 41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing IHDR chunk to alpha_blob."); 41460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,8,(const unsigned char *) 41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "\211PNG\r\n\032\n"); 41490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,13L); 41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IHDR); 415203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IHDR,13L); 41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+4,jng_width); 41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+8,jng_height); 41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[12]=jng_alpha_sample_depth; 41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[13]=0; /* color_type gray */ 41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[14]=0; /* compression method 0 */ 41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[15]=0; /* filter_method 0 */ 41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[16]=0; /* interlace_method 0 */ 41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,17,data); 41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,17)); 41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickTrue; 41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JDAT,4) == 0) 41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 416947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk to color_image->blob */ 41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAT chunk data to color_blob."); 41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(color_image,length,chunk); 417647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 417947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 41803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IDAT,4) == 0) 41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 418847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy IDAT header and chunk data to alpha_image->blob */ 41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying IDAT chunk data to alpha_blob."); 41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4196bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(alpha_image,(size_t) length); 41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IDAT); 419803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IDAT,length); 41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image, 42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(crc32(0,data,4),chunk,(uInt) length)); 42033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_JDAA,4) == 0) || (memcmp(type,mng_JdAA,4) == 0)) 42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 421347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk data to alpha_image->blob */ 42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAA chunk data to alpha_blob."); 42203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 42223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 42253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JSEP,4) == 0) 42313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickTrue; 42330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 42353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 2) 42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=image->background_color.red; 42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=image->background_color.red; 42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 6) 42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=ScaleCharToQuantum(p[3]); 42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=ScaleCharToQuantum(p[5]); 42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 42638182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->gamma=((float) mng_get_long(p))*0.00001; 42640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42738182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.x=0.00001*mng_get_long(p); 42748182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.y=0.00001*mng_get_long(&p[4]); 42758182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.x=0.00001*mng_get_long(&p[8]); 42768182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.y=0.00001*mng_get_long(&p[12]); 42778182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.x=0.00001*mng_get_long(&p[16]); 42788182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.y=0.00001*mng_get_long(&p[20]); 42798182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.x=0.00001*mng_get_long(&p[24]); 42808182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.y=0.00001*mng_get_long(&p[28]); 42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 428247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 1) 42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4291e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent= 4292cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 4293da7803d6b1161960bc1e7db4d9718284c116fab8cristy image->gamma=1.000f/2.200f; 42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x=0.6400f; 42953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y=0.3300f; 42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x=0.3000f; 42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y=0.6000f; 42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x=0.1500f; 42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y=0.0600f; 43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x=0.3127f; 43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.y=0.3290f; 43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 430347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_oFFs,4) == 0) 43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43125eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.x=(ssize_t) mng_get_long(p); 43135eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.y=(ssize_t) mng_get_long(&p[4]); 43140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] != 0) 43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x/=10000; 43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y/=10000; 43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 432147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 433216ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) mng_get_long(p); 433316ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) mng_get_long(&p[4]); 43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] == PNG_RESOLUTION_METER) 43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 433716ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=image->resolution.x/100.0f; 433816ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=image->resolution.y/100.0f; 43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0 43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4349fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 43513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 43563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 43583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 43593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4)) 43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* IEND found */ 43683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finish up reading image data: 43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o read main image from color_blob. 43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close color_blob. 43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color_type has alpha) 43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is PNG 43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadPNG 43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is JPEG 43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadJPEG 43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close alpha_blob. 43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o copy intensity of secondary image into 438516ea139d53d867211d3bb0fa859a83de653f687ecristy alpha samples of main image. 43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o destroy the secondary image. 43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(color_image); 439147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading jng_image from color_blob."); 43950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43963b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(color_image_info->filename,MaxTextExtent,"%s", 43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image->filename); 43980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info->ping=MagickFalse; /* To do: avoid this */ 44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(color_image_info,exception); 44010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(color_image->filename); 44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=DestroyImage(color_image); 44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=DestroyImageInfo(color_image_info); 44083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 44103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying jng_image pixels to main image."); 44150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=jng_height; 44173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=jng_width; 44180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4419bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 44203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 442116ea139d53d867211d3bb0fa859a83de653f687ecristy s=GetVirtualPixels(jng_image,0,y,image->columns,1,exception); 44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 442316ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 442416ea139d53d867211d3bb0fa859a83de653f687ecristy { 442516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(jng_image,s),q); 442616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(jng_image,s),q); 442716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(jng_image,s),q); 442816ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 442916ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 443016ea139d53d867211d3bb0fa859a83de653f687ecristy } 443147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 44370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type >= 12) 44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 44433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 44463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,0x00000000L); 44473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IEND); 444803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0L); 44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,4)); 44513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(alpha_image); 44540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 445716ea139d53d867211d3bb0fa859a83de653f687ecristy " Reading alpha from alpha_blob."); 44583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44593b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(alpha_image_info->filename,MaxTextExtent, 44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",alpha_image->filename); 44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(alpha_image_info,exception); 44630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 4465bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 44663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s=GetVirtualPixels(jng_image,0,y,image->columns,1, 446816ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 447047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 447216ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 447316ea139d53d867211d3bb0fa859a83de653f687ecristy { 447416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 447516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 447616ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 447716ea139d53d867211d3bb0fa859a83de653f687ecristy } 44780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 448016ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 448216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 448316ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickTrue; 448516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 448616ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 44873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 44903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(alpha_image->filename); 44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 44943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=DestroyImageInfo(alpha_image_info); 44953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 44963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 44973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 450047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read the JNG image. */ 450147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_width=jng_width; 45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_height=jng_height; 45063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.width == 0 && image->page.height == 0) 45090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 45100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.width=jng_width; 45110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.height=jng_height; 45120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 45130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x == 0 && image->page.y == 0) 45150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 45160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.x=mng_info->x_off[mng_info->object_id]; 45170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 45180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 45190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 45210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 45220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 45230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 45240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 45263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,2*TellBlob(image), 45273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 45280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOneJNGImage()"); 45320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 45343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 45353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d J N G I m a g e % 45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadJNGImage() reads a JPEG Network Graphics (JNG) image file 45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (including the 8-byte signature) and returns it. It allocates the memory 45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadJNGImage method is: 45553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadJNGImage(const ImageInfo *image_info, ExceptionInfo 45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% *exception) 45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadJNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 45723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 457421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 457521f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 45833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 45883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 45893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 45903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 4595fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadJNGImage()"); 459616ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 45990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 46020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"JNG") != 0) 46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 46050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 460647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify JNG signature. */ 460747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 460947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46103b8763efd02f5343a141d40636f6a8dfdc2c7682glennrp if (count < 8 || memcmp(magic_number,"\213JNG\r\n\032\n",8) != 0) 46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 46120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 461347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 461447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 461673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(*mng_info)); 46170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 46193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 46200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 462147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 462247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 46243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 46253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 46273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 46283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 46293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 46300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 46323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsImageObject(previous) != MagickFalse) 46343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 46420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 464647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 46483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 46520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadJNGImage()"); 46580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 46603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 46613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 46623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 46643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy page_geometry[MaxTextExtent]; 46673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 46693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 46703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *previous; 46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46724383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 467321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 467421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure; 46754383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object, 46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found, 46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 46813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4682bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile ssize_t 46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 46903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb, 46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb, 46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb; 46983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 470016ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color; 47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 47053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4707bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 47093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 47113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4713bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level; 47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile short 47173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop; 47183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 47213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=0, 47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; /* 0: PNG or JNG; 1: MNG; 2: MNG-LC; 3: MNG-VLC */ 47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4730bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 47313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout, 47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout, 47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 47343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_height, 47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_width, 47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 473938ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp /* These delays are all measured in image ticks_per_second, 474038ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp * not in MNG ticks_per_second 474138ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp */ 4742bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 47433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay, 47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay, 47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay, 47463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay, 47473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers, 47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=1, 47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0, 47523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_height=0, 47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_width=0; 47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.top=0; 47563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.bottom=0; 47573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.left=0; 47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.right=0; 47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.top=0; 47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.bottom=0; 47613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.left=0; 47623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.right=0; 47633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 476447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Open image file. */ 476547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 47683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception->signature == MagickSignature); 4771fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadMNGImage()"); 477216ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 47750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 47780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 47813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 478247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 478347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 478447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 478573bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 47860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 47890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 479047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 479147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magic_number[MaxTextExtent]; 48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 480147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify MNG signature. */ 48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\212MNG\r\n\032\n",8) != 0) 48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 480547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 480647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize some nonzero members of the MngInfo structure. */ 48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4809bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 4810bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[0]=MagickTrue; 48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 481447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickTrue; 48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; 48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickFalse; /* should be False when converting or mogrifying */ 48193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=0; 48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=0; 48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1; 48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=0; 48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 48303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=MagickFalse; 48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color=image->background_color; 48343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=mng_info->frame; 48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=mng_info->frame; 48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[MaxTextExtent]; 48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new chunk. 48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(type,"errr",MaxTextExtent); 48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,4,(unsigned char *) type); 48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4857e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading MNG chunk type %c%c%c%c, length: %.20g", 4858e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX) 48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickFalse; 48620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (count == 0) 48643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 48650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 48673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 48680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 48703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 487247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 48743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 487547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 4876bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 48773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 487847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 48803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 48833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(JNG_SUPPORTED) 48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 48880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->jhdr_warning == 0) 489016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"JNGCompressNotSupported","`%s'",image->filename); 48920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->jhdr_warning++; 48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DHDR,4) == 0) 48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 48990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->dhdr_warning == 0) 490116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DeltaPNGNotSupported","`%s'",image->filename); 49030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->dhdr_warning++; 49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MEND,4) == 0) 49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 490847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4) == 0) 49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 49130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 49160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skip to IEND."); 49200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MHDR,4) == 0) 49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4926bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 49280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4929bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 49310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4935e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG width: %.20g",(double) mng_info->mng_width); 49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4937e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG height: %.20g",(double) mng_info->mng_height); 49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=8; 49418182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->ticks_per_second=(size_t) mng_get_long(p); 49420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second == 0) 49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 49450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=1UL*image->ticks_per_second/ 49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second; 49490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0; 49520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=16; 49568182b0758e3429fb8dcd1700f09643fd4d80a41ccristy simplicity=(size_t) mng_get_long(p); 49573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=1; /* Full MNG */ 49600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 11) == 11)) 49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=2; /* LC */ 49630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 9) == 9)) 49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=3; /* VLC */ 49660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type != 3) 49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickTrue; 49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 497116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 497347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 497416ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 49750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 49780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 49823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->mng_width > 65535L) || 49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height > 65535L)) 49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); 49860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49873b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(page_geometry,MaxTextExtent, 4988e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "%.20gx%.20g+0+0",(double) mng_info->mng_width,(double) 4989f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->mng_height); 49900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.left=0; 4992bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.right=(ssize_t) mng_info->mng_width; 49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.top=0; 4994bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.bottom=(ssize_t) mng_info->mng_height; 49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=default_fb=previous_fb=mng_info->frame; 49960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_info->frame; 49990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_TERM,4) == 0) 50053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=0; 50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 50113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=p[0]; 50120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (repeat == 3) 50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50158182b0758e3429fb8dcd1700f09643fd4d80a41ccristy final_delay=(png_uint_32) mng_get_long(&p[2]); 50168182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_iterations=(png_uint_32) mng_get_long(&p[6]); 50170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == PNG_UINT_31_MAX) 50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=0; 50200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickTrue; 50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 50283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " repeat=%d",repeat); 50290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5031e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " final_delay=%.20g",(double) final_delay); 50320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5034e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->iterations=%.20g",(double) image->iterations); 50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DEFI,4) == 0) 50413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 504316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DEFI chunk found in MNG-VLC datastream","`%s'", 50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 50460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=(p[0] << 8) | p[1]; 50480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 2 && object_id != 0) 505016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Nonzero object_id in MNG-LC datastream","`%s'", 50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 50530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id > MNG_MAX_OBJECTS) 50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5057edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp Instead of using a warning we should allocate a larger 50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo structure and continue. 50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 506016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"object id too large","`%s'",image->filename); 50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=MNG_MAX_OBJECTS; 50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[object_id]) 50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->frozen[object_id]) 50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 506916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "DEFI cannot redefine a frozen MNG object","`%s'", 50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 50770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 2) 50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[object_id]=p[2]; 50800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object offset info. 50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 50843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->x_off[object_id]=(ssize_t) ((p[4] << 24) | 50870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[5] << 16) | (p[6] << 8) | p[7]); 50880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->y_off[object_id]=(ssize_t) ((p[8] << 24) | 50900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[9] << 16) | (p[10] << 8) | p[11]); 50910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5095e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " x_off[%d]: %.20g",object_id,(double) 5096f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->x_off[object_id]); 50970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5099e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " y_off[%d]: %.20g",object_id,(double) 5100f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->y_off[object_id]); 51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 51053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object clipping info. 51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 27) 51083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[object_id]=mng_read_box(mng_info->frame,0, 51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &p[12]); 51100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickFalse; 51170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 5) 51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.red= 51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 51220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.green= 51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 51250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.blue= 51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 51280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickTrue; 51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 51333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BACK,4) == 0) 51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=p[6]; 51400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 51430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mandatory_back && length > 5) 51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.red= 51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 51480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.green= 51503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 51510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.blue= 51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 51540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 515516ea139d53d867211d3bb0fa859a83de653f687ecristy mng_background_color.alpha=OpaqueAlpha; 51563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 51593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 51603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=(p[7] << 8) | p[8]; 51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 51623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 51633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 516647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PLTE,4) == 0) 51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 516947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global PLTE. */ 517047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length && (length < 769)) 51723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte == (png_colorp) NULL) 51743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) AcquireQuantumMemory(256, 51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*mng_info->global_plte)); 51760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5177bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) (length/3); i++) 51783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=p[3*i]; 51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=p[3*i+1]; 51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=p[3*i+2]; 51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 518435ef824baa82511126ff0072ae30eee0da9c05a3cristy mng_info->global_plte_length=(unsigned int) (length/3); 51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=i; 51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=i; 51913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=i; 51923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=256; 51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 51973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=0; 51990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 520347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_tRNS,4) == 0) 52053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* read global tRNS */ 52073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 257) 5209bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 52103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=p[i]; 52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=255; 52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 521612560f31d66b4ef4afdcff2c20807c555dcf2f7dcristy mng_info->global_trns_length=(unsigned int) length; 52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 52213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5224bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy igamma; 52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52278182b0758e3429fb8dcd1700f09643fd4d80a41ccristy igamma=mng_get_long(p); 52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_gamma=((float) igamma)*0.00001; 52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickTrue; 52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickFalse; 52340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 524147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global cHRM */ 524247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52458182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.x=0.00001*mng_get_long(p); 52468182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.y=0.00001*mng_get_long(&p[4]); 52478182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.red_primary.x=0.00001*mng_get_long(&p[8]); 52483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.red_primary.y=0.00001* 52498182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[12]); 52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.x=0.00001* 52518182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[16]); 52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.y=0.00001* 52538182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[20]); 52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.x=0.00001* 52558182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[24]); 52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.y=0.00001* 52578182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[28]); 52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickTrue; 52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickFalse; 526247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 526647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global sRGB. 52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5274e610a071534e448c46460a5aa39ede33bf56b329glennrp mng_info->global_srgb_intent= 5275cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickTrue; 52773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickFalse; 528047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 528447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5287fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 52883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global iCCP. 52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 52923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 529447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 529747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_FRAM,4) == 0) 52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 530116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"FRAM chunk found in MNG-VLC datastream","`%s'", 53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 53040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->framing_mode == 2) || (mng_info->framing_mode == 4)) 53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 53070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout=default_frame_timeout; 53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=default_fb; 531147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p[0]) 53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=p[0]; 53150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Framing_mode=%d",mng_info->framing_mode); 53190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 532247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Note the delay and frame clipping boundaries. */ 532347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* framing mode */ 532547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5326bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy while (*p && ((p-chunk) < (ssize_t) length)) 53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name */ 532847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name terminator */ 533047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5331bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((p-chunk) < (ssize_t) (length-4)) 53323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay, 53353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout, 53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping; 53373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay=(*p++); 53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout=(*p++); 53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping=(*p++); 53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* change_sync */ 534247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay) 53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53458182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay=1UL*image->ticks_per_second* 53468182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(p); 53470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53488182b0758e3429fb8dcd1700f09643fd4d80a41ccristy if (mng_info->ticks_per_second != 0) 53498182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay/=mng_info->ticks_per_second; 53500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5351bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5352bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_delay=PNG_UINT_31_MAX; 53530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=frame_delay; 53560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 53580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5361e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_delay=%.20g",(double) frame_delay); 53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 536347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_timeout) 53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5366bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=1UL*image->ticks_per_second* 5367bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp mng_get_long(p); 53680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5369bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp if (mng_info->ticks_per_second != 0) 5370bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout/=mng_info->ticks_per_second; 53710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5372bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5373bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=PNG_UINT_31_MAX; 53740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=frame_timeout; 53770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 53790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5382e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_timeout=%.20g",(double) frame_timeout); 53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 538447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping) 53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=mng_read_box(previous_fb,(char) p[0],&p[1]); 53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=17; 53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=fb; 53900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 53930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Frame_clip: L=%.20g R=%.20g T=%.20g B=%.20g", 5394e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.left,(double) fb.right,(double) fb.top, 5395e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.bottom); 539647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping == 2) 53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=fb; 53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=fb; 54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_minimum_box(fb,mng_info->frame); 54040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5405bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_width=(size_t) (mng_info->clip.right 54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.left); 54070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5408bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_height=(size_t) (mng_info->clip.bottom 54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.top); 54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the frame if framing_mode is 4. 54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 54153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5416e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " subframe_width=%.20g, subframe_height=%.20g",(double) 5417e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy subframe_width,(double) subframe_height); 54180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 4) && 54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height)) 54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 542247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 542316ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 542516ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 542647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 543347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 54380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 54480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 54513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 54533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 54543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 54563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 545816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 54590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 54620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert backgd layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 5463e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 5464e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLIP,4) == 0) 54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 54743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 54773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read CLIP. 54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 54793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object=(p[0] << 8) | p[1]; 54803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object=(p[2] << 8) | p[3]; 548147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=(int) first_object; i <= (int) last_object; i++) 54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i] && !mng_info->frozen[i]) 54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 54873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box=mng_info->object_clip[i]; 54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_read_box(box,(char) p[4],&p[5]); 54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 549347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SAVE,4) == 0) 54983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 55003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i]) 55013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickTrue; 55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 55043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->frozen=MagickTrue; 55063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 55073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_DISC,4) == 0) || (memcmp(type,mng_SEEK,4) == 0)) 55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 551747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read DISC or SEEK. */ 551847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((length == 0) || !memcmp(type,mng_SEEK,4)) 55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5527bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 55293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5530bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (j=0; j < (ssize_t) length; j+=2) 55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i=p[j] << 8 | p[j+1]; 55333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 55343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 554247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MOVE,4) == 0) 55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5545bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 554947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* read MOVE */ 555047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object=(p[0] << 8) | p[1]; 55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object=(p[2] << 8) | p[3]; 5553bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=(ssize_t) first_object; i <= (ssize_t) last_object; i++) 55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i] && !mng_info->frozen[i]) 55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_pair; 55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair; 55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair.a=mng_info->x_off[i]; 55643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_pair.b=mng_info->y_off[i]; 55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_pair=mng_read_pair(old_pair,(int) p[4],&p[5]); 55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->x_off[i]=new_pair.a; 55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->y_off[i]=new_pair.b; 55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 557047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_LOOP,4) == 0) 55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5577bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t loop_iters=1; 55783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=chunk[0]; 55793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=1; /* mark loop active */ 558047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 558147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Record starting point. */ 55828182b0758e3429fb8dcd1700f09643fd4d80a41ccristy loop_iters=mng_get_long(&chunk[1]); 55830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5586e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " LOOP level %.20g has %.20g iterations ",(double) loop_level, 5587e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) loop_iters); 55880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (loop_iters == 0) 55903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=loop_level; 55910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_jump[loop_level]=TellBlob(image); 55953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_count[loop_level]=loop_iters; 55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_iteration[loop_level]=0; 55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 56013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 560247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_ENDL,4) == 0) 56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=chunk[0]; 560647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skipping_loop > 0) 56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skipping_loop == loop_level) 56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Found end of zero-iteration loop. 56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 56143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=0; 56163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 561847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_active[loop_level] == 1) 56223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_count[loop_level]--; 56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_iteration[loop_level]++; 56250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " ENDL: LOOP level %.20g has %.20g remaining iters ", 5629e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) loop_level,(double) 5630f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->loop_count[loop_level]); 563147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_count[loop_level] != 0) 56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset=SeekBlob(image,mng_info->loop_jump[loop_level], 56353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SEEK_SET); 56360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError, 56393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "ImproperImageHeader"); 56403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 564147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy short 56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level; 56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finished loop. 56493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 56503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->loop_active[loop_level]=0; 56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level=(-1); 56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < loop_level; i++) 56533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->loop_active[i] == 1) 56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_level=(short) i; 56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level=last_level; 56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 565947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 566347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLON,4) == 0) 56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->clon_warning == 0) 566716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 56683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"CLON is not implemented yet","`%s'", 56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 567047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clon_warning++; 56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 567347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MAGN,4) == 0) 56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 1) 56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=(p[0] << 8) | p[1]; 56900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=0; 56930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 3) 56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=(p[2] << 8) | p[3]; 56960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=magn_first; 56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef MNG_OBJECT_BUFFERS 57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first || magn_last) 57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 570316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MAGN is not implemented yet for nonzero objects", 57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 570747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 4) 57123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=p[4]; 571347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=0; 57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=(p[5] << 8) | p[6]; 571947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 572247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mx == 0) 57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 57253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 57273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=(p[7] << 8) | p[8]; 572847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=magn_mx; 573147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_my == 0) 57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=1; 57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 10) 57363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=(p[9] << 8) | p[10]; 573747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=magn_mx; 574047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_ml == 0) 57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=1; 57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 12) 57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=(p[11] << 8) | p[12]; 574647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=magn_mx; 574947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mr == 0) 57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=1; 57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 14) 57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=(p[13] << 8) | p[14]; 575547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=magn_my; 575847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mt == 0) 57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=1; 57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=(p[15] << 8) | p[16]; 576447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=magn_my; 576747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mb == 0) 57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=1; 57703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 57723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=p[17]; 577347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=magn_methx; 57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 577747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx > 5 || magn_methy > 5) 57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 57803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 578116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 57823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 57833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Unknown MAGN method in MNG datastream","`%s'", 57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 578547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 57893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Magnify existing objects in the range magn_first to magn_last */ 57903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first == 0 || magn_last == 0) 57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Save the magnification factors for object 0 */ 57943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mb=magn_mb; 57953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_ml=magn_ml; 57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mr=magn_mr; 57973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mt=magn_mt; 57983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mx=magn_mx; 57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_my=magn_my; 58003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methx=magn_methx; 58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methy=magn_methy; 58023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 580447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PAST,4) == 0) 58063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->past_warning == 0) 580816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 58093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"PAST is not implemented yet","`%s'", 58103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 581147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->past_warning++; 58133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 581447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SHOW,4) == 0) 58163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->show_warning == 0) 581816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"SHOW is not implemented yet","`%s'", 58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 582147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->show_warning++; 58233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 582447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sBIT,4) == 0) 58263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 4) 58283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickFalse; 582947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.gray=p[0]; 58333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.red=p[0]; 58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.green=p[1]; 58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.blue=p[2]; 58363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.alpha=p[3]; 58373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickTrue; 58383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 58413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 58433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_x_pixels_per_unit= 58458182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(p); 58463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_y_pixels_per_unit= 58478182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(&p[4]); 58483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_phys_unit_type=p[8]; 58493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickTrue; 58503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 585147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickFalse; 58543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYg,4) == 0) 58563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->phyg_warning == 0) 585816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"pHYg is not implemented.","`%s'",image->filename); 586047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->phyg_warning++; 58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BASI,4) == 0) 58643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 58653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 586647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->basi_warning == 0) 586816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 58693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"BASI is not implemented yet","`%s'", 58703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 587147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->basi_warning++; 58733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 5874bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 58753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 5876bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 58773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 58783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type=p[8]; 58793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method=p[9]; 58803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type=p[10]; 58813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method=p[11]; 58823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 58833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=(p[12] << 8) & p[13]; 588447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=0; 588747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 13) 58893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=(p[14] << 8) & p[15]; 589047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 58923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=0; 589347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 15) 58953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=(p[16] << 8) & p[17]; 589647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 58983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=0; 589947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=(p[18] << 8) & p[19]; 590247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (basi_sample_depth == 16) 59063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=65535L; 59073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=255; 59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 591047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 19) 59123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=p[20]; 591347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=0; 591647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 59203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 592147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) 59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy && memcmp(type,mng_JHDR,4) 59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ) 59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Not an IHDR or JHDR chunk */ 59293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length) 59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 593147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Process IHDR */ 59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 59373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing %c%c%c%c chunk",type[0],type[1],type[2],type[3]); 593847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[object_id]=MagickTrue; 594147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->invisible[object_id]) 59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skipping invisible object"); 594747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 595547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59568182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_width=(size_t) mng_get_long(p); 59578182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_height=(size_t) mng_get_long(&p[4]); 59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a transparent background layer behind the entire animation 59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if it is not full screen. 59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 59663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && mng_type && first_mng_object) 59673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->clip.left > 0) || (mng_info->clip.top > 0) || 59693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_width < mng_info->mng_width) || 5970bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.right < (ssize_t) mng_info->mng_width) || 59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_height < mng_info->mng_height) || 5972bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.bottom < (ssize_t) mng_info->mng_height)) 59733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 597416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 59753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 597916ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 598047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 59853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 598747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 599147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 59933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 599847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 600147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 600247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Make a background rectangle. */ 600347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 601216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6015e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted transparent background layer, W=%.20g, H=%.20g", 6016e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->mng_width,(double) mng_info->mng_height); 60173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the upcoming image if 60213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode is 3, and we haven't already inserted one. 60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 3) && 60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height) && (simplicity == 0 || 60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (simplicity & 0x08))) 60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 602716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 60303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 603216ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 603347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 60383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 60393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 604047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 60450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 60513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 605547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 60643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 606516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 60660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 60683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 60690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 6070e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 6071e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MNG_INSERT_LAYERS */ 60743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 607547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 607616ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 60773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 608116ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 608247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 60873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 608947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 60950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 60980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 61070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->framing_mode == 1 || mng_info->framing_mode == 3) 61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 61113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 61123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 61160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 61193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->x_off[object_id]; 61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[object_id]; 61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 612247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 61243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Seek back to the beginning of the IHDR or JHDR chunk's length field. 61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 612647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Seeking back to beginning of %c%c%c%c chunk",type[0],type[1], 61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[2],type[3]); 613147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6132bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy offset=SeekBlob(image,-((ssize_t) length+12),SEEK_CUR); 613347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous=image; 61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 61403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_type=mng_type; 61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_id=object_id; 61423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) == 0) 61443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 614547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (IsImageObject(previous) != MagickFalse) 61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) DestroyImageList(previous); 61563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(previous); 61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 615847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type) 61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box; 61773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx || mng_info->magn_methy) 61793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height, 61823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width; 61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing MNG MAGN chunk"); 61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx == 1) 61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width=mng_info->magn_ml; 619147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr; 619447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 619647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 619747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-2)*(mng_info->magn_mx)); 61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 619947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62024e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width=(png_uint_32) image->columns; 620347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_ml-1; 620647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr-1; 620947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 3) 621147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 621247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-3)*(mng_info->magn_mx-1)); 62133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 621447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methy == 1) 62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height=mng_info->magn_mt; 621847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb; 622147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 622347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 622447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-2)*(mng_info->magn_my)); 62253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 622647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62294e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_height=(png_uint_32) image->rows; 623047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mt-1; 623347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb-1; 623647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 3) 623847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 623947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-3)*(mng_info->magn_my-1)); 62403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 624147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magnified_height > image->rows || 62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width > image->columns) 62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 62463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *large_image; 62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy; 62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 625116ea139d53d867211d3bb0fa859a83de653f687ecristy Quantum 625216ea139d53d867211d3bb0fa859a83de653f687ecristy *next, 625316ea139d53d867211d3bb0fa859a83de653f687ecristy *prev; 625416ea139d53d867211d3bb0fa859a83de653f687ecristy 625516ea139d53d867211d3bb0fa859a83de653f687ecristy png_uint_16 625616ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methx, 625716ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methy; 625816ea139d53d867211d3bb0fa859a83de653f687ecristy 6259bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m, 62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 626316ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *n, 62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 626716ea139d53d867211d3bb0fa859a83de653f687ecristy register ssize_t 626816ea139d53d867211d3bb0fa859a83de653f687ecristy x; 62693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 627047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 627147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 62743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocate magnified image"); 627547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 627616ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 627747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 62823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image=SyncNextImageInList(image); 62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->columns=magnified_width; 62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->rows=magnified_height; 62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=mng_info->magn_methx; 62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=mng_info->magn_methy; 62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62933faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM unsigned short 62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 62963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Scale pixels to unsigned shorts to prevent 62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy overflow of intermediate values of interpolations 63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6301bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1, 63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 630547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6306bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 630816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleQuantumToShort( 630916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 631016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleQuantumToShort( 631116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 631216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleQuantumToShort( 631316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 631416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleQuantumToShort( 631516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 631616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 63173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 631847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 63213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM Quantum 63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 632816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 632947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 633216ea139d53d867211d3bb0fa859a83de653f687ecristy large_image->background_color.alpha=OpaqueAlpha; 633316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 633447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=2; 633747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=3; 634047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 63423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=2; 634347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=3; 63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the rows into the right side of the large image */ 63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 63513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6352e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the rows to %.20g",(double) large_image->rows); 6353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy=0; 635516ea139d53d867211d3bb0fa859a83de653f687ecristy length=(size_t) image->columns*GetPixelChannels(image); 635616ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) AcquireQuantumMemory(length,sizeof(*next)); 635716ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) AcquireQuantumMemory(length,sizeof(*prev)); 635847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 635916ea139d53d867211d3bb0fa859a83de653f687ecristy if ((prev == (Quantum *) NULL) || 636016ea139d53d867211d3bb0fa859a83de653f687ecristy (next == (Quantum *) NULL)) 63613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 63633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 63643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 63663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 636747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,0,image->columns,1,exception); 63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 637047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6371bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (y == 0) 6374bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 637547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6376bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-2) 6377bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 637847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6379bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy <= 1 && y == (ssize_t) image->rows-1) 6380bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 638147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6382bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-1) 63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 638447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6386bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_my; 638747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=prev; 63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=next; 63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=n; 639147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6392bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (y < (ssize_t) image->rows-1) 63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,y+1,image->columns,1, 63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 63973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 639847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++, yy++) 64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 640116ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6404bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(yy < (ssize_t) large_image->rows); 64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=prev; 64063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=next; 64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(large_image,0,yy,large_image->columns, 64089fff7b4fa7d657da7bfed66239982b85c6337de9cristy 1,exception); 640916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=(large_image->columns-image->columns)* 641016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelChannels(large_image); 641147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6412bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6414fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: get color as function of indexes[x] */ 64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 64203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy <= 1) 64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6423bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /* replicate previous */ 642416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,pixels),q); 642516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 642616ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 642716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 642816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 642916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 643016ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 643247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methy == 2 || magn_methy == 4) 64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6436bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 643716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 643816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 643916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 644016ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 644116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 644216ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 644316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 644416ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6445bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 644647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 645016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,((QM) (((ssize_t) 645116ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelRed(image,n) 645216ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels)+m))/ 6453bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 645416ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelRed(image,pixels)))),q); 645516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,((QM) (((ssize_t) 645616ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelGreen(image,n) 645716ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels)+m))/ 6458bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 645916ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelGreen(image,pixels)))),q); 646016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,((QM) (((ssize_t) 646116ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelBlue(image,n) 646216ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels)+m))/ 6463bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 646416ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelBlue(image,pixels)))),q); 646547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 646716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image, ((QM) (((ssize_t) 646816ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelAlpha(image,n) 646916ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)+m)) 6470bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 647116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)))),q); 64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 647347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 64753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 64773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 647816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 647916ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 648116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 648216ea139d53d867211d3bb0fa859a83de653f687ecristy n),q); 64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 648547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methy == 3 || magn_methy == 5) */ 64873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 64893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6490bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 649116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 649216ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 649316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 649416ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 649516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 649616ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 649716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 649816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6499bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 650047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6502bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 650316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,n),q); 650416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image,n), 650516ea139d53d867211d3bb0fa859a83de653f687ecristy q); 650616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image,n), 650716ea139d53d867211d3bb0fa859a83de653f687ecristy q); 650816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image,n), 650916ea139d53d867211d3bb0fa859a83de653f687ecristy q); 6510bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 651147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 65133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 651416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,(QM) (((ssize_t) (2*i* 651516ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,n) 651616ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)) 6517bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp +m))/((ssize_t) (m*2)) 651816ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 65193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 652116ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 652216ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(large_image); 652316ea139d53d867211d3bb0fa859a83de653f687ecristy pixels+=GetPixelChannels(image); 65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* x */ 652547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(large_image,exception) == 0) 65273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 652847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* i */ 65303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* y */ 653147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 653216ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) RelinquishMagickMemory(prev); 653316ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) RelinquishMagickMemory(next); 65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns; 65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 65383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 65393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Delete original image"); 65403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DeleteImageFromList(&image); 65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=large_image; 65443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 65463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the columns */ 65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6550e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the columns to %.20g",(double) image->columns); 65513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6552bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 65533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 655416ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 65553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 65563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 655816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels=q+(image->columns-length)*GetPixelChannels(image); 655916ea139d53d867211d3bb0fa859a83de653f687ecristy n=pixels+GetPixelChannels(image); 656047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6561bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (image->columns-length); 6562bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy x < (ssize_t) image->columns; x++) 65633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 656416ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 65657c7b31566a7598be23cac1b5e32c697cfe7082f4glennrp 6566bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (x == (ssize_t) (image->columns-length)) 6567bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_ml; 656847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6569bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-2) 6570bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 657147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6572bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx <= 1 && x == (ssize_t) image->columns-1) 6573bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 657447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6575bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-1) 65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 657747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6579bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mx; 658047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++) 65823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx <= 1) 65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* replicate previous */ 658616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 658716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 658816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 658916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 65903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 659147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methx == 2 || magn_methx == 4) 65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6595bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 659616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 659716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 659816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 659916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6600bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 660147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 660216ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 66033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 660616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,(QM) ((2*i*( 660716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,n) 660816ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels))+m) 6609bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 661016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,pixels)),q); 6611bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 661216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,(QM) ((2*i*( 661316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,n) 661416ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels))+m) 6615bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 661616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,pixels)),q); 6617bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 661816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,(QM) ((2*i*( 661916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,n) 662016ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels))+m) 6621bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 662216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,pixels)),q); 66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 662416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,(QM) ((2*i*( 662516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n) 662616ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m) 6627bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 662816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)),q); 66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 663047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 66323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 66343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6635bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 663616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 663716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)+0,q); 6638bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6640bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 664116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 664216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n)+0,q); 6643bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 664647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methx == 3 || magn_methx == 5) */ 66483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6651bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 665216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 665316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 665416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 665516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6656bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 665747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6659bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 666016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,n),q); 666116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,n),q); 666216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,n),q); 666316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,n),q); 6664bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 666547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 66673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 666916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 667016ea139d53d867211d3bb0fa859a83de653f687ecristy (QM) ((2*i*( GetPixelAlpha(image,n) 667116ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m)/ 6672bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 667316ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 66743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 667616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 66773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 667816ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 667916ea139d53d867211d3bb0fa859a83de653f687ecristy p+=GetPixelChannels(image); 66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 668147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 66843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66853faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 66863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 66873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 66893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Rescale pixels to Quantum 66903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6691bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 66923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 669447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6695bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 66963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 669716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleShortToQuantum( 669816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 669916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleShortToQuantum( 670016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 670116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleShortToQuantum( 670216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 670316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleShortToQuantum( 670416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 670516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 67063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 670747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 67093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 67133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 67153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished MAGN processing"); 67163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 67203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_box is with respect to the upper left corner of the MNG. 67213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.left=mng_info->image_box.left+mng_info->x_off[object_id]; 67233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.right=mng_info->image_box.right+mng_info->x_off[object_id]; 67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.top=mng_info->image_box.top+mng_info->y_off[object_id]; 67253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.bottom=mng_info->image_box.bottom+mng_info->y_off[object_id]; 67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->clip); 67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->frame); 67283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->object_clip[object_id]); 67293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left != (mng_info->image_box.left 67303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 67313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.right != (mng_info->image_box.right 67323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 67333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top != (mng_info->image_box.top 67343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id])) || 67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.bottom != (mng_info->image_box.bottom 67363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id]))) 67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 67403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Crop the PNG image"); 674147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left < crop_box.right) && 67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top < crop_box.bottom)) 67443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 67463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *im; 67473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info; 67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_info is with respect to the upper left corner of 67533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the image. 67543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 67553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.x=(crop_box.left-mng_info->x_off[object_id]); 67563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.y=(crop_box.top-mng_info->y_off[object_id]); 6757bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.width=(size_t) (crop_box.right-crop_box.left); 6758bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.height=(size_t) (crop_box.bottom-crop_box.top); 67593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 67603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 67613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 67623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=CropImage(image,&crop_info,exception); 676447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (im != (Image *) NULL) 67663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=im->columns; 67683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=im->rows; 67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=DestroyImage(im); 67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 67713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 67723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=crop_box.left; 67733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=crop_box.top; 67743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 677647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 67783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 67803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy No pixels in crop area. The MNG spec still requires 67813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a layer, though, so make a single transparent pixel in 67823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the top left corner. 67833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=1; 67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=1; 67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 678716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=1; 67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=1; 67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 67913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 67953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 67963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67992b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 68002b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 680116ea139d53d867211d3bb0fa859a83de653f687ecristy * if lossy. 68022b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 68032b013e4b9b602533eff410e61c3683fb2a3ab913glennrp if (image->depth > 16) 68042b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 68052b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 68062b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 68073faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 6808cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 6809cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 6810cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 6811cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 6812cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 6813cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 681416ea139d53d867211d3bb0fa859a83de653f687ecristy if (LosslessReduceDepthOK(image,exception) != MagickFalse) 68158640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6817d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 68183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->scenes_found > 6821bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) (image_info->first_scene+image_info->number_scenes)) 68223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 68233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 6824d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 68253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 68273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading image datastream."); 6828d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 68293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (LocaleCompare(image_info->magick,"MNG") == 0); 683047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 683247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading all image datastreams."); 683647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 68383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && !mng_info->image_found && (mng_info->mng_width) && 68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height)) 68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer if nothing else was found. 68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 68463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No images found. Inserting a background layer."); 68470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 684816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 68493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 68513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 68523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 685316ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 68543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 68553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 68573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 685847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 68613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocation failed, returning NULL."); 686247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 68643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 68663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 68683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 68693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 68703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 68713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 68723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 68733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 68743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte=MagickFalse; 68750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 68763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 687716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 68780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 68803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 68830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == 1) 68853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 68860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 68873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 68883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 68903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count > 10*mng_info->image_found) 68913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," No beginning"); 689447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 689516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted, beginning of list not found", 68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 689847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 69003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 69030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 69053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Corrupt list"); 690847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 690916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 69103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted; next_image is NULL","`%s'", 69113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 69123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 691447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second && mng_info->image_found > 1 && 69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetNextImageInList(image) == 69173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (Image *) NULL) 69183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " First image null"); 692247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 692316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"image->next for first image is NULL but shouldn't be.", 69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 69263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 692747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->image_found == 0) 69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No visible images found."); 693347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 693416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 69353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"No visible images in file","`%s'",image_info->filename); 693647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 693947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 69413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second) 69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1UL*MagickMax(image->ticks_per_second,1L)* 69463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/mng_info->ticks_per_second; 69470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 69493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 69500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Find final nonzero image delay */ 69523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=0; 69530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay) 69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=image->delay; 695847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 69603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay < final_image_delay) 69633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=final_image_delay; 69640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=final_delay; 69660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6969e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->delay=%.20g, final_delay=%.20g",(double) image->delay, 6970e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) final_delay); 69710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 69783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 697947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Before coalesce:"); 698247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6984e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g",(double) image->delay); 698547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 69893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6990e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g",(double) scene++,(double) image->delay); 69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 69953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_COALESCE_LAYERS 69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers) 69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image, 70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next; 70013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7002bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Coalesce Images"); 700747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=image->scene; 700916ea139d53d867211d3bb0fa859a83de653f687ecristy next_image=CoalesceImages(image,exception); 701047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 70123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 701347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 701647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next=image; next != (Image *) NULL; next=next_image) 70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.width=mng_info->mng_width; 70203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.height=mng_info->mng_height; 70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.x=0; 70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.y=0; 70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->scene=scene++; 70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next); 702547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 702847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->delay == 0) 70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->previous=GetPreviousImageInList(next); 70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetPreviousImageInList(next) == (Image *) NULL) 70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 70363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->previous->next=next_image; 70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=DestroyImage(next); 70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 70443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 704547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->dispose=BackgroundDispose; 70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 705547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " After coalesce:"); 705847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7060e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g dispose=%.20g",(double) image->delay, 7061e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->dispose); 706247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 7064f2faecf9facdbbb14fcba373365f9f691a9658e0cristy { 7065f2faecf9facdbbb14fcba373365f9f691a9658e0cristy image=GetNextImageInList(image); 706647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7067f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7068e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g dispose=%.20g",(double) scene++, 7069e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay,(double) image->dispose); 7070f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 7071f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 707247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 70753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 707647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()"); 707947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 70813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 708225c1e2baba76d9cf3ec582f217f96af95259e747glennrp#else /* PNG_LIBPNG_VER > 10011 */ 70833ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 70853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 70863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 708747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "PNG library is too old","`%s'",image_info->filename); 709047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(Image *) NULL; 70923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 709347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70943ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ReadPNGImage(image_info,exception)); 70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 709825c1e2baba76d9cf3ec582f217f96af95259e747glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 71023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r P N G I m a g e % 71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 71113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterPNGImage() adds properties for the PNG image format to 71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The properties include the image format 71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterPNGImage method is: 71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7121bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterPNGImage(void) 71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 71233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7124bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterPNGImage(void) 71253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 71263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy version[MaxTextExtent]; 71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy static const char 71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *PNGNote= 71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/ for details about the PNG format." 71363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 713747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *JNGNote= 71393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the JNG\n" 71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 714347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *MNGNote= 71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the MNG\n" 71473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 71483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 715147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_LIBPNG_VER_STRING) 71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,"libpng ",MaxTextExtent); 71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,PNG_LIBPNG_VER_STRING,MaxTextExtent); 715547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(PNG_LIBPNG_VER_STRING,png_get_header_ver(NULL)) != 0) 71573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,",",MaxTextExtent); 71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,png_get_libpng_ver(NULL), 71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MaxTextExtent); 71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 716347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("MNG"); 71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->seekable_stream=MagickTrue; /* To do: eliminate this. */ 716647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadMNGImage; 71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteMNGImage; 71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 717147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsMNG; 71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Multiple-image Network Graphics"); 717447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 71763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 717747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(MNGNote); 71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG"); 718347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 71853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 718847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("Portable Network Graphics"); 71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 719347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 719647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(PNGNote); 71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 71993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG8"); 720147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 720647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString( 72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "8-bit indexed with optional binary transparency"); 72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG24"); 72153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 721647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(ZLIB_VERSION) 72183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,"zlib ",MaxTextExtent); 72193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,ZLIB_VERSION,MaxTextExtent); 722047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(ZLIB_VERSION,zlib_version) != 0) 72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,",",MaxTextExtent); 72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,zlib_version,MaxTextExtent); 72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 722747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 723047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 72323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 72333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 723547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("opaque 24-bit RGB"); 72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("PNG32"); 724347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 72463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 72473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 724847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("opaque or transparent 32-bit RGBA"); 72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry=SetMagickInfo("JNG"); 725647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadJNGImage; 72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteJNGImage; 72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 726347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsJNG; 72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->adjoin=MagickFalse; 72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->description=ConstantString("JPEG Network Graphics"); 72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->module=ConstantString("PNG"); 72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(JNGNote); 72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 727047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7271edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 7272cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_semaphore=AllocateSemaphoreInfo(); 727318b17443128598500357da7bff2f01683cf32890cristy#endif 727447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 72773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r P N G I m a g e % 72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage() removes format registrations made by the 72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG module from the list of supported formats. 72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterPNGImage method is: 72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage(void) 72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterPNGImage(void) 72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("MNG"); 73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG"); 73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG8"); 73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG24"); 73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG32"); 73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("JNG"); 730547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7306edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 7307cf002022280cc4dedb2748ad6f415aac1d44f530glennrp if (ping_semaphore != (SemaphoreInfo *) NULL) 7308cf002022280cc4dedb2748ad6f415aac1d44f530glennrp DestroySemaphoreInfo(&ping_semaphore); 73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 731325c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if PNG_LIBPNG_VER > 10011 73143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 73153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e M N G I m a g e % 73203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteMNGImage() writes an image in the Portable Network Graphics 73263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Group's "Multiple-image Network Graphics" encoded image format. 73273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteMNGImage method is: 73313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 733216ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteMNGImage(const ImageInfo *image_info, 733316ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 73343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 734116ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 73423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do (as of version 5.5.2, November 26, 2002 -- glennrp -- see also 73443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "To do" under ReadPNGImage): 73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Write the iCCP chunk at MNG level when (icc profile length > 0) 73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Improve selection of color type (use indexed-colour or indexed-colour 73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% with tRNS when 256 or fewer unique RGBA values are present). 73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Figure out what to do with "dispose=<restore-to-previous>" (dispose == 3) 73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% This will be complicated if we limit ourselves to generating MNG-LC 73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files. For now we ignore disposal method 3 and simply overlay the next 73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image on it. 73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical PLTE's or PLTE/tRNS combinations and use a 73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% global MNG PLTE or PLTE/tRNS combination when appropriate. 73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% [mostly done 15 June 1999 but still need to take care of tRNS] 73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sRGB and replace with a global sRGB (and remove 73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% gAMA/cHRM if sRGB is found; check for identical gAMA/cHRM and 73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% replace with global gAMA/cHRM (or with sRGB if appropriate; replace 73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% local gAMA/cHRM with local sRGB if appropriate). 73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sBIT chunks and write global ones. 73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide option to skip writing the signature tEXt chunks. 73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use signatures to detect identical objects and reuse the first 73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instance of such objects instead of writing duplicate objects. 73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use a smaller-than-32k value of compression window size when 73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% appropriate. 73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Encode JNG datastreams. Mostly done as of 5.5.2; need to write 73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary text chunks and save profiles. 73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force LC files (to ensure exact framing rate) 73833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instead of VLC. 73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force VLC files instead of LC, even when offsets 73863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% are present. This will involve expanding the embedded images with a 73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparent region at the top and/or left. 73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 7391cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_png_write_raw_profile(const ImageInfo *image_info,png_struct *ping, 73923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info *ping_info, unsigned char *profile_type, unsigned char 73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile_description, unsigned char *profile_data, png_uint_32 length) 73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7398bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *sp; 74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp; 74063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length, 74093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length; 74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 74123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 74133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((char *) profile_type+1, "ng-chunk-",9) == 0) 74153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return; 74163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) printf("writing raw profile: type=%s, length=%.20g\n", 74200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (char *) profile_type, (double) length); 74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text)); 74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length=(png_uint_32) strlen((const char *) profile_description); 74253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length=(png_uint_32) (length*2 + (length >> 5) + 20 74263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy + description_length); 74273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text=(png_charp) png_malloc(ping,allocated_length); 74283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key=(png_charp) png_malloc(ping, (png_uint_32) 80); 74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key[0]='\0'; 74303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key, 74313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Raw profile type ",MaxTextExtent); 74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key,(const char *) profile_type,62); 74333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=profile_data; 74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=text[0].text; 74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 74363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(dp,(const char *) profile_description, 74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length); 74383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=description_length; 74393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 74403b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(dp,allocated_length- 7441f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (png_size_t) (dp-text[0].text),"%8lu ",(unsigned long) length); 74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=8; 744347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7444bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%36 == 0) 74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp >> 4) & 0x0f)]; 74493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp++ ) & 0x0f)]; 74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 745147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp='\0'; 74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length=(png_size_t) (dp-text[0].text); 74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].compression=image_info->compression == NoCompression || 74563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->compression == UndefinedCompression && 74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length < 128) ? -1 : 0; 745847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (text[0].text_length <= allocated_length) 74603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_text(ping,ping_info,text,1); 746147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].text); 74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].key); 74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text); 74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7467cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic MagickBooleanType Magick_png_write_chunk_from_profile(Image *image, 74684383ec8c3c8811128f5a8a034d67c47db5e7e75acristy const char *string, MagickBooleanType logging) 74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 74703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 74743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 74773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *data; 74783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 length; 74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 748247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 748347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 748447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 748647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (const StringInfo *) NULL) 74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 7490cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_profile; 74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 749247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (LocaleNCompare(name,string,11) == 0) 749347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 749447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (logging != MagickFalse) 749547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 749647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp " Found %s profile",name); 749747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7498cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=CloneStringInfo(profile); 7499cf002022280cc4dedb2748ad6f415aac1d44f530glennrp data=GetStringInfoDatum(ping_profile), 7500cf002022280cc4dedb2748ad6f415aac1d44f530glennrp length=(png_uint_32) GetStringInfoLength(ping_profile); 750147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[4]=data[3]; 750247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[3]=data[2]; 750347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[2]=data[1]; 750447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[1]=data[0]; 750547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,length-5); /* data length */ 750647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlob(image,length-1,data+1); 750747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,crc32(0,data+1,(uInt) length-1)); 7508cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=DestroyStringInfo(ping_profile); 750947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp } 75103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 751147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 75133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 751447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 75163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 75173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7518b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 7519b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp/* Write one PNG image */ 75203ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, 752116ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *IMimage_info,Image *IMimage,ExceptionInfo *exception) 75223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 752316ea139d53d867211d3bb0fa859a83de653f687ecristy Image 752416ea139d53d867211d3bb0fa859a83de653f687ecristy *image; 752516ea139d53d867211d3bb0fa859a83de653f687ecristy 752616ea139d53d867211d3bb0fa859a83de653f687ecristy ImageInfo 752716ea139d53d867211d3bb0fa859a83de653f687ecristy *image_info; 752816ea139d53d867211d3bb0fa859a83de653f687ecristy 75293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 75303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s[2]; 75313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 75333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name, 75343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *property, 75353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 75363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 75383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 75393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 7542cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp pass; 7543cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp 7544e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp png_byte 7545e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_trans_alpha[256]; 75465af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 754739992b4dd9b12ef752d55b8e402c069698851f72glennrp png_color 754839992b4dd9b12ef752d55b8e402c069698851f72glennrp palette[257]; 75493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_color_16 75515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background, 75525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color; 75535af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 75543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75605af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_uint_32 75615af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_height, 75625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_width; 75635af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7564bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 756858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp image_matte, 756921f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 757058e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp matte, 757158e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp 7572da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob, 7573fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency, 7574d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color, 75758d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw, 757639992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE, 7577991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD, 7578991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs, 7579991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS, 758026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 758126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_bKGD, 758226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_cHRM, 7583a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date, 7584e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_EXIF, */ 758526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_gAMA, 758626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_iCCP, 758726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* ping_exclude_iTXt, */ 758826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_oFFs, 758926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_pHYs, 759026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_sRGB, 759126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_tEXt, 7592e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_tRNS, */ 759326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_vpAg, 759426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zCCP, /* hex-encoded iCCP */ 759526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zTXt, 759626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 75978d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap, 75980e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning, 75990e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 760082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp status, 76018ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332, 7602d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_333, 7603d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444; 76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 760816ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 760916ea139d53d867211d3bb0fa859a83de653f687ecristy error_info; 761016ea139d53d867211d3bb0fa859a83de653f687ecristy 7611bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 7616cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_pixels; 76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76185af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp volatile int 7619f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors, 76200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth, 76215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type, 76225af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method, 76235af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method, 76245af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method, 76255af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans; 76265af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7627bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 76285af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth, 76295af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp old_bit_depth; 76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7631bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality, 76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes, 76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth; 76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7636dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp int 7637fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp j, 7638f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, 76398bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque, 76408bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent, 76418bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent, 7642dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type; 7643dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 7644dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp png_uint_32 7645dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution, 7646dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution; 7647dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 7649fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOnePNGImage()"); 76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 765116ea139d53d867211d3bb0fa859a83de653f687ecristy image = CloneImage(IMimage,0,0,MagickFalse,exception); 765216ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=(ImageInfo *) CloneImageInfo(IMimage_info); 765316ea139d53d867211d3bb0fa859a83de653f687ecristy if (image_info == (ImageInfo *) NULL) 765416ea139d53d867211d3bb0fa859a83de653f687ecristy ThrowWriterException(ResourceLimitError, "MemoryAllocationFailed"); 7655b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 76565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp /* Initialize some stuff */ 76570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=0, 76585af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=0, 76595af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=0, 76605af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method=0, 76615af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method=0, 76625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans = 0; 76635af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 76645af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.red = 0; 76655af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.green = 0; 76665af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.blue = 0; 76675af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.gray = 0; 76685af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.index = 0; 76695af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 76705af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red=0; 76715af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green=0; 76725af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue=0; 76735af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=0; 76745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7675dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type = 0; 7676dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution = 0; 7677dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution = 0; 7678dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 7679da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickFalse; 7680d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color=MagickTrue; 76818d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw=MagickTrue; 768239992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickFalse; 7683991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD=MagickFalse; 7684991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs=MagickFalse; 7685991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS=MagickFalse; 7686991d11dd9c33e65872778b81aff1347cd2878154glennrp 76870e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_bKGD=mng_info->ping_exclude_bKGD; 76880e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_cHRM=mng_info->ping_exclude_cHRM; 7689a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date=mng_info->ping_exclude_date; 7690dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_EXIF=mng_info->ping_exclude_EXIF; */ 76910e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_gAMA=mng_info->ping_exclude_gAMA; 76920e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_iCCP=mng_info->ping_exclude_iCCP; 76930e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* ping_exclude_iTXt=mng_info->ping_exclude_iTXt; */ 76940e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_oFFs=mng_info->ping_exclude_oFFs; 76950e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_pHYs=mng_info->ping_exclude_pHYs; 76960e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_sRGB=mng_info->ping_exclude_sRGB; 76970e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_tEXt=mng_info->ping_exclude_tEXt; 7698dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_tRNS=mng_info->ping_exclude_tRNS; */ 76990e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_vpAg=mng_info->ping_exclude_vpAg; 77000e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zCCP=mng_info->ping_exclude_zCCP; /* hex-encoded iCCP in zTXt */ 77010e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zTXt=mng_info->ping_exclude_zTXt; 77020e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 77038d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap = mng_info->ping_preserve_colormap; 77040e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning = MagickFalse; 77050e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 77060d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Recognize the ICC sRGB profile and convert it to the sRGB chunk, 77070d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * i.e., eliminate the ICC profile and set image->rendering_intent. 77080d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * Note that this will not involve any changes to the actual pixels 77090d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * but merely passes information to applications that read the resulting 77100d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * PNG image. 77110d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy */ 77120d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (ping_exclude_sRGB == MagickFalse) 77130d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 77140d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy char 77150d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *name; 77160d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 77170d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy const StringInfo 77180d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *profile; 77190d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 77200d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ResetImageProfileIterator(image); 77210d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 77220d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 77230d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy profile=GetImageProfile(image,name); 77240d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 77250d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (profile != (StringInfo *) NULL) 77260d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 77270d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((LocaleCompare(name,"ICC") == 0) || 772816ea139d53d867211d3bb0fa859a83de653f687ecristy (LocaleCompare(name,"ICM") == 0)) 772916ea139d53d867211d3bb0fa859a83de653f687ecristy { 7730ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp int 7731ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp icheck; 77320d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 7733ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp /* 0: not a known sRGB profile 7734ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp * 1: HP-Microsoft sRGB v2 7735ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp * 2: ICC sRGB v4 perceptual 7736ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp * 3: ICC sRGB v2 perceptual no black-compensation 7737ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp */ 77380d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy png_uint_32 7739ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp check_crc[4] = {0, 0xf29e526dUL, 0xbbef7812UL, 0x427ebb21UL}, 7740ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp check_len[4] = {0, 3144, 60960, 3052}; 77410d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 7742ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp png_uint_32 7743ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length, 7744ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp profile_crc; 774529a106ed9ec29e243521b0f2a26c14281de8347fglennrp 7746ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp unsigned char 7747ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp *data; 77480d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 7749ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length=(png_uint_32) GetStringInfoLength(profile); 775029a106ed9ec29e243521b0f2a26c14281de8347fglennrp 7751ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp for (icheck=3; icheck > 0; icheck--) 775229a106ed9ec29e243521b0f2a26c14281de8347fglennrp { 7753ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (length == check_len[icheck]) 7754ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 7755ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7756ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp " Got a %lu-byte ICC profile (potentially sRGB)", 7757ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (unsigned long) length); 77580d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 7759ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp data=GetStringInfoDatum(profile); 7760ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp profile_crc=crc32(0,data,length); 77610d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 7762ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7763e54cd4b9aa386137b617b4b7fc66436c70466007glennrp " with crc=%8x",(unsigned int) profile_crc); 7764ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp 7765ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (profile_crc == check_crc[icheck]) 7766ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 7767ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7768ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp " It is sRGB."); 7769ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (image->rendering_intent==UndefinedIntent) 7770ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp image->rendering_intent=PerceptualIntent; 7771ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp break; 7772ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp } 777329a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 77740d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 7775ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (icheck == 0) 777629a106ed9ec29e243521b0f2a26c14281de8347fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7777ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp " Got a %lu-byte ICC profile", 777829a106ed9ec29e243521b0f2a26c14281de8347fglennrp (unsigned long) length); 777929a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 77800d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 77810d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy name=GetNextImageProfile(image); 77820d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 77830d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 77840d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 77858bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque = 0; 77868bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent = 0; 77878bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent = 0; 77888bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 7789fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 7790fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 7791fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == UndefinedClass) 7792fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7793fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " storage_class=UndefinedClass"); 7794fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == DirectClass) 7795fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7796fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " storage_class=DirectClass"); 7797fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass) 7798fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7799fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " storage_class=PseudoClass"); 7800fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 780128af3713c9111a471cc868c787760de89236fa3cglennrp 7802750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp if (image->storage_class == PseudoClass && 78037e65e93c71716f2a5c03c0808adedae21d519fb2glennrp (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32 || 78047e65e93c71716f2a5c03c0808adedae21d519fb2glennrp (mng_info->write_png_colortype != 0 && 78057e65e93c71716f2a5c03c0808adedae21d519fb2glennrp mng_info->write_png_colortype != 4))) 78067e65e93c71716f2a5c03c0808adedae21d519fb2glennrp { 780716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 78087e65e93c71716f2a5c03c0808adedae21d519fb2glennrp image->storage_class = DirectClass; 78097e65e93c71716f2a5c03c0808adedae21d519fb2glennrp } 78107e65e93c71716f2a5c03c0808adedae21d519fb2glennrp 7811c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (ping_preserve_colormap == MagickFalse) 781228af3713c9111a471cc868c787760de89236fa3cglennrp { 7813c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (image->storage_class != PseudoClass && image->colormap != NULL) 7814c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 7815c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp /* Free the bogus colormap; it can cause trouble later */ 7816c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 7817c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7818c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Freeing bogus colormap"); 7819e9ac4c3545df599381509bfa2a60d58971d3c5b8cristy (void) RelinquishMagickMemory(image->colormap); 7820c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp image->colormap=NULL; 7821c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 782228af3713c9111a471cc868c787760de89236fa3cglennrp } 7823bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 7824501c5597e8d10b6102a4566f2740f4166bdd545fcristy if (IssRGBColorspace(image->colorspace) == MagickFalse) 782516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) TransformImageColorspace(image,sRGBColorspace,exception); 78260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 78273241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp /* 78283241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp Sometimes we get PseudoClass images whose RGB values don't match 78293241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp the colors in the colormap. This code syncs the RGB values. 78303241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp */ 78313241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp if (image->depth <= 8 && image->taint && image->storage_class == PseudoClass) 783216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 78333241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 7834a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 7835a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (image->depth > 8) 7836a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp { 7837a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 7838a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7839a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Reducing PNG bit depth to 8 since this is a Q8 build."); 7840a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 7841a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp image->depth=8; 7842a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp } 7843a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 7844a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 78458e58efdecda887b08ef730d68290a61081ef2566glennrp /* Respect the -depth option */ 784667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->depth < MAGICKCORE_QUANTUM_DEPTH) 784767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp { 784816ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 78498e58efdecda887b08ef730d68290a61081ef2566glennrp *r; 78508e58efdecda887b08ef730d68290a61081ef2566glennrp 78518e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->depth > 8) 78528e58efdecda887b08ef730d68290a61081ef2566glennrp { 78538e58efdecda887b08ef730d68290a61081ef2566glennrp#if MAGICKCORE_QUANTUM_DEPTH > 16 78548e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 16-bit */ 785591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR16PacketRGBO(image->background_color); 78568e58efdecda887b08ef730d68290a61081ef2566glennrp 78578e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 78588e58efdecda887b08ef730d68290a61081ef2566glennrp { 785916ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 78608e58efdecda887b08ef730d68290a61081ef2566glennrp 786116ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 78628e58efdecda887b08ef730d68290a61081ef2566glennrp break; 78638e58efdecda887b08ef730d68290a61081ef2566glennrp 78648e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 78658e58efdecda887b08ef730d68290a61081ef2566glennrp { 786616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR16PixelRGBA(r); 786716ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 78688e58efdecda887b08ef730d68290a61081ef2566glennrp } 7869bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 78708e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 78718e58efdecda887b08ef730d68290a61081ef2566glennrp break; 78728e58efdecda887b08ef730d68290a61081ef2566glennrp } 78738e58efdecda887b08ef730d68290a61081ef2566glennrp 78748e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 78758e58efdecda887b08ef730d68290a61081ef2566glennrp { 78763e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 78778e58efdecda887b08ef730d68290a61081ef2566glennrp { 787891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR16PacketRGBO(image->colormap[i]); 78798e58efdecda887b08ef730d68290a61081ef2566glennrp } 78808e58efdecda887b08ef730d68290a61081ef2566glennrp } 78818e58efdecda887b08ef730d68290a61081ef2566glennrp#endif /* MAGICKCORE_QUANTUM_DEPTH > 16 */ 78828e58efdecda887b08ef730d68290a61081ef2566glennrp } 78838e58efdecda887b08ef730d68290a61081ef2566glennrp 78848e58efdecda887b08ef730d68290a61081ef2566glennrp else if (image->depth > 4) 78858e58efdecda887b08ef730d68290a61081ef2566glennrp { 78868e58efdecda887b08ef730d68290a61081ef2566glennrp#if MAGICKCORE_QUANTUM_DEPTH > 8 78878e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 8-bit */ 788891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR08PacketRGBO(image->background_color); 78898e58efdecda887b08ef730d68290a61081ef2566glennrp 78908e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 78918e58efdecda887b08ef730d68290a61081ef2566glennrp { 789216ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 78938e58efdecda887b08ef730d68290a61081ef2566glennrp 789416ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 78958e58efdecda887b08ef730d68290a61081ef2566glennrp break; 78968e58efdecda887b08ef730d68290a61081ef2566glennrp 78978e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 78988e58efdecda887b08ef730d68290a61081ef2566glennrp { 789916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR08PixelRGBA(r); 790016ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 79018e58efdecda887b08ef730d68290a61081ef2566glennrp } 7902bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 79038e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 79048e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79058e58efdecda887b08ef730d68290a61081ef2566glennrp } 79068e58efdecda887b08ef730d68290a61081ef2566glennrp 79078e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 79088e58efdecda887b08ef730d68290a61081ef2566glennrp { 79093e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 79108e58efdecda887b08ef730d68290a61081ef2566glennrp { 791191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR08PacketRGBO(image->colormap[i]); 79128e58efdecda887b08ef730d68290a61081ef2566glennrp } 79138e58efdecda887b08ef730d68290a61081ef2566glennrp } 79148e58efdecda887b08ef730d68290a61081ef2566glennrp#endif /* MAGICKCORE_QUANTUM_DEPTH > 8 */ 79158e58efdecda887b08ef730d68290a61081ef2566glennrp } 79168e58efdecda887b08ef730d68290a61081ef2566glennrp else 79178e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->depth > 2) 79188e58efdecda887b08ef730d68290a61081ef2566glennrp { 79198e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 4-bit */ 792091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->background_color); 79218e58efdecda887b08ef730d68290a61081ef2566glennrp 79228e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 79238e58efdecda887b08ef730d68290a61081ef2566glennrp { 792416ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 79258e58efdecda887b08ef730d68290a61081ef2566glennrp 792616ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 79278e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79288e58efdecda887b08ef730d68290a61081ef2566glennrp 79298e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 79308e58efdecda887b08ef730d68290a61081ef2566glennrp { 793116ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PixelRGBA(r); 793216ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 79338e58efdecda887b08ef730d68290a61081ef2566glennrp } 7934bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 79358e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 79368e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79378e58efdecda887b08ef730d68290a61081ef2566glennrp } 79388e58efdecda887b08ef730d68290a61081ef2566glennrp 79398e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 79408e58efdecda887b08ef730d68290a61081ef2566glennrp { 79413e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 79428e58efdecda887b08ef730d68290a61081ef2566glennrp { 794391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->colormap[i]); 79448e58efdecda887b08ef730d68290a61081ef2566glennrp } 79458e58efdecda887b08ef730d68290a61081ef2566glennrp } 79468e58efdecda887b08ef730d68290a61081ef2566glennrp } 79478e58efdecda887b08ef730d68290a61081ef2566glennrp 79488e58efdecda887b08ef730d68290a61081ef2566glennrp else if (image->depth > 1) 79498e58efdecda887b08ef730d68290a61081ef2566glennrp { 79508e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 2-bit */ 795191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->background_color); 79528e58efdecda887b08ef730d68290a61081ef2566glennrp 79538e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 79548e58efdecda887b08ef730d68290a61081ef2566glennrp { 795516ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 79568e58efdecda887b08ef730d68290a61081ef2566glennrp 795716ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 79588e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79598e58efdecda887b08ef730d68290a61081ef2566glennrp 79608e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 79618e58efdecda887b08ef730d68290a61081ef2566glennrp { 796216ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PixelRGBA(r); 796316ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 79648e58efdecda887b08ef730d68290a61081ef2566glennrp } 7965bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 79668e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 79678e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79688e58efdecda887b08ef730d68290a61081ef2566glennrp } 79698e58efdecda887b08ef730d68290a61081ef2566glennrp 79708e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 79718e58efdecda887b08ef730d68290a61081ef2566glennrp { 79723e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 79738e58efdecda887b08ef730d68290a61081ef2566glennrp { 797491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->colormap[i]); 79758e58efdecda887b08ef730d68290a61081ef2566glennrp } 79768e58efdecda887b08ef730d68290a61081ef2566glennrp } 79778e58efdecda887b08ef730d68290a61081ef2566glennrp } 79788e58efdecda887b08ef730d68290a61081ef2566glennrp else 79798e58efdecda887b08ef730d68290a61081ef2566glennrp { 79808e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 1-bit */ 798191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->background_color); 79828e58efdecda887b08ef730d68290a61081ef2566glennrp 79838e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 79848e58efdecda887b08ef730d68290a61081ef2566glennrp { 798516ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 79868e58efdecda887b08ef730d68290a61081ef2566glennrp 798716ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 79888e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79898e58efdecda887b08ef730d68290a61081ef2566glennrp 79908e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 79918e58efdecda887b08ef730d68290a61081ef2566glennrp { 799216ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PixelRGBA(r); 799316ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 79948e58efdecda887b08ef730d68290a61081ef2566glennrp } 7995bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 79968e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 79978e58efdecda887b08ef730d68290a61081ef2566glennrp break; 79988e58efdecda887b08ef730d68290a61081ef2566glennrp } 79998e58efdecda887b08ef730d68290a61081ef2566glennrp 80008e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 80018e58efdecda887b08ef730d68290a61081ef2566glennrp { 80023e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 80038e58efdecda887b08ef730d68290a61081ef2566glennrp { 800491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->colormap[i]); 80058e58efdecda887b08ef730d68290a61081ef2566glennrp } 80068e58efdecda887b08ef730d68290a61081ef2566glennrp } 80078e58efdecda887b08ef730d68290a61081ef2566glennrp } 8008cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp } 8009cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp 801067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* To do: set to next higher multiple of 8 */ 801167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->depth < 8) 801270e68a844517efda3094dc170a8f54affc9c82bcglennrp image->depth=8; 8013a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 80142b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 80152b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 80162b013e4b9b602533eff410e61c3683fb2a3ab913glennrp * if lossy 80172b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 80188e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->depth > 8) 80192b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 80202b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 80212b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 80223faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 8023cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 8024cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 8025cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 8026cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 8027cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 8028cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 8029c722dd852e8abe407c2846d39662f7ade9c234deglennrp if (image->depth == 16 && mng_info->write_png_depth != 16) 803016ea139d53d867211d3bb0fa859a83de653f687ecristy if (mng_info->write_png8 || LosslessReduceDepthOK(image,exception) != MagickFalse) 80318640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 80328640fb5e9b1094f35f8beab436f81661b8a99448glennrp#endif 80338640fb5e9b1094f35f8beab436f81661b8a99448glennrp 8034c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* Normally we run this just once, but in the case of writing PNG8 8035e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * we reduce the transparency to binary and run again, then if there 8036e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * are still too many colors we reduce to a simple 4-4-4-1, then 3-3-3-1 80378ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * RGBA palette and run again, and then to a simple 3-3-2-1 RGBA 80388ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * palette. Then (To do) we take care of a final reduction that is only 80398ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * needed if there are still 256 colors present and one of them has both 80408ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * transparent and opaque instances. 8041c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 804282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 80438ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickFalse; 804482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickFalse; 8045d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickFalse; 804682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 80478ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (j=0; j<6; j++) 8048d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8049d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* BUILD_PALETTE 8050d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8051d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get DirectClass images that have 256 colors or fewer. 8052d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will build a colormap. 8053d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8054d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also, sometimes we get PseudoClass images with an out-of-date 8055d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * colormap. This code will replace the colormap with a new one. 8056d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get PseudoClass images that have more than 256 colors. 8057d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will delete the colormap and change the image to 8058d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * DirectClass. 8059d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 806016ea139d53d867211d3bb0fa859a83de653f687ecristy * If image->matte is MagickFalse, we ignore the alpha channel 8061d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * even though it sometimes contains left-over non-opaque values. 8062d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8063d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also we gather some information (number of opaque, transparent, 8064d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * and semitransparent pixels, and whether the image has any non-gray 8065d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixels or only black-and-white pixels) that we might need later. 8066d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8067d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Even if the user wants to force GrayAlpha or RGBA (colortype 4 or 6) 8068d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * we need to check for bogus non-opaque values, at least. 8069d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 80703c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8071d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp int 8072d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n; 80738bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 807416ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8075d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp opaque[260], 8076d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp semitransparent[260], 8077d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp transparent[260]; 80788bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 807916ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 808016ea139d53d867211d3bb0fa859a83de653f687ecristy *s; 8081d6bf1617e99df0272b231855a933a74e99b6578fglennrp 808216ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 808316ea139d53d867211d3bb0fa859a83de653f687ecristy *q, 8084fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *r; 8085fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8086d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8087d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8088d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Enter BUILD_PALETTE:"); 8089d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8090d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8091d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8092d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8093d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->columns=%.20g",(double) image->columns); 8094d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8095d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->rows=%.20g",(double) image->rows); 8096d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8097d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->matte=%.20g",(double) image->matte); 809803812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8099d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->depth=%.20g",(double) image->depth); 81003c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8101fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 81027ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 81037ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8104d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Original colormap:"); 81058bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 810616ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 81072cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8108d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < 256; i++) 81097ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 8110d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8111d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8112d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8113d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8114d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8115d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 811616ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 81177ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp } 81182cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8119d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=image->colors - 10; i < (ssize_t) image->colors; i++) 8120d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8121d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i > 255) 8122d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8123d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8124d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8125d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8126d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8127d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8128d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 812916ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8130d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8131d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8132d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 81332cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8134d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8135d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d",(int) image->colors); 813683c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8137d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colors == 0) 813816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 813916ea139d53d867211d3bb0fa859a83de653f687ecristy " (zero means unknown)"); 81407ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 81418d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap == MagickFalse) 81428d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 81438d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp " Regenerate the colormap"); 8144d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 81457ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 8146d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=0; 8147fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_opaque = 0; 8148fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_semitransparent = 0; 8149fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_transparent = 0; 81502cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8151d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8152d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8153d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 81547ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 815516ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8156d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 815797fd3d052fbd2e629d5d2387f26de9e250dd3e32glennrp 8158d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8159d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 81604737d521d1d9e5d9a7c55375027ba4befc711046glennrp if (image->matte == MagickFalse || 816116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q) == OpaqueAlpha) 81628d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8163d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259) 81648d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8165d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque == 0) 8166d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 816716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque); 816816ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[0].alpha=OpaqueAlpha; 8169d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque=1; 8170d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8171d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8172d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_opaque; i++) 8173d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 817416ea139d53d867211d3bb0fa859a83de653f687ecristy if (IsPixelEquivalent(image,q, opaque+i)) 8175d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8176d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8177d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 817816ea139d53d867211d3bb0fa859a83de653f687ecristy if (i == (ssize_t) number_opaque && number_opaque < 259) 8179d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8180d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque++; 818116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque+i); 818216ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[i].alpha=OpaqueAlpha; 8183d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 81848d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 81858d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 818616ea139d53d867211d3bb0fa859a83de653f687ecristy else if (GetPixelAlpha(image,q) == TransparentAlpha) 81878d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8188d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 259) 81898d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8190d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent == 0) 8191d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 819216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, transparent); 819316ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red=(unsigned short) 819416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q); 819516ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green=(unsigned short) 819616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q); 819716ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue=(unsigned short) 819816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q); 819916ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.gray=(unsigned short) 820016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q); 8201d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent = 1; 8202d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8203d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8204d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_transparent; i++) 8205d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 820616ea139d53d867211d3bb0fa859a83de653f687ecristy if (IsPixelEquivalent(image,q, transparent+i)) 8207d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8208d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8209d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8210d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_transparent && 8211d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent < 259) 8212d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8213d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent++; 821416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,transparent+i); 8215d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 82168d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 82178d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 8218d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8219d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8220d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 259) 8221d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8222d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent == 0) 8223d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 822416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,semitransparent); 8225d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent = 1; 8226d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 82278d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 8228d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_semitransparent; i++) 8229d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 823016ea139d53d867211d3bb0fa859a83de653f687ecristy if (IsPixelEquivalent(image,q, semitransparent+i) 823116ea139d53d867211d3bb0fa859a83de653f687ecristy && GetPixelAlpha(image,q) == 823216ea139d53d867211d3bb0fa859a83de653f687ecristy semitransparent[i].alpha) 8233d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8234d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8235d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8236d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_semitransparent && 8237d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent < 259) 8238d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8239d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent++; 824016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, semitransparent+i); 8241d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8242d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 82438bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 824416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8245d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8246d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 82473c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 82484054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png8 == MagickFalse && 82494054bfbdca478fe065f01d7f8285f7c173ccfcfccristy ping_exclude_bKGD == MagickFalse) 8250d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8251d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Add the background color to the palette, if it 8252d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * isn't already there. 8253d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8254c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8255c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8256c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8257c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Check colormap for background (%d,%d,%d)", 8258c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.red, 8259c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.green, 8260c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.blue); 8261c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8262d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8263d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8264ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp if (opaque[i].red == image->background_color.red && 8265ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].green == image->background_color.green && 8266ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].blue == image->background_color.blue) 8267ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp break; 8268d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8269d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259 && i == number_opaque) 827003812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 82718e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp opaque[i] = image->background_color; 8272c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index = i; 8273c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8274c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8275c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8276c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d",(int) i); 8277c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8278c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 827903812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 8280a080bc32a4a8b2ffec83fd836a28753959175363glennrp else if (logging != MagickFalse) 8281a080bc32a4a8b2ffec83fd836a28753959175363glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8282a080bc32a4a8b2ffec83fd836a28753959175363glennrp " No room in the colormap to add background color"); 8283d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 82842cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8285d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=number_opaque+number_transparent+number_semitransparent; 82863241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8287a080bc32a4a8b2ffec83fd836a28753959175363glennrp if (mng_info->write_png8 != MagickFalse && image_colors > 256) 8288a080bc32a4a8b2ffec83fd836a28753959175363glennrp { 8289a080bc32a4a8b2ffec83fd836a28753959175363glennrp /* No room for the background color; remove it. */ 8290a080bc32a4a8b2ffec83fd836a28753959175363glennrp number_opaque--; 8291a080bc32a4a8b2ffec83fd836a28753959175363glennrp image_colors--; 8292a080bc32a4a8b2ffec83fd836a28753959175363glennrp } 8293a080bc32a4a8b2ffec83fd836a28753959175363glennrp 8294d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8295d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8296d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors > 256) 8297d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8298d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has more than 256 colors"); 82993241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8300d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8301d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8302d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has %d colors",image_colors); 8303d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 83043241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 83058d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap != MagickFalse) 83068d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp break; 83078d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 8308fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (mng_info->write_png_colortype != 7) /* We won't need this info */ 8309d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8310d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickFalse; 8311d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickFalse; 83123241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8313d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if(image_colors > 256) 8314d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8315d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8316d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8317d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83186185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 831916ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8320d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 83216185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8322e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp s=q; 8323e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp for (x=0; x < (ssize_t) image->columns; x++) 8324e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 832516ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != GetPixelGreen(image,s) || 832616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != GetPixelBlue(image,s)) 8327e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 8328e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_color=MagickTrue; 8329e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_non_bw=MagickTrue; 8330e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8331e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 833216ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8333e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8334e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8335e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp if (ping_have_color != MagickFalse) 8336e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8337e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8338d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Worst case is black-and-white; we are looking at every 8339d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixel twice. 8340d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 83416185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8342d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8343d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8344d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp s=q; 8345d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 83466185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 834716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != 0 && 834816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != QuantumRange) 8349d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8350d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8351e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8352d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 835316ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8354d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8355e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8356d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8357bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 8358bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 83594f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 8360d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors < 257) 8361d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 836216ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8363d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[260]; 8364bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8365d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* 8366d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Initialize image colormap. 8367d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8368d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8369d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8370d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8371d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Sort the new colormap"); 8372d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8373d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Sort palette, transparent first */; 8374d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8375d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n = 0; 83763241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8377d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_transparent; i++) 8378d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = transparent[i]; 83793241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8380d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_semitransparent; i++) 8381d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = semitransparent[i]; 8382d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8383d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8384d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = opaque[i]; 8385d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8386c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index += 8387c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (number_transparent + number_semitransparent); 8388bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8389d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* image_colors < 257; search the colormap instead of the pixels 8390d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * to get ping_have_color and ping_have_non_bw 8391d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8392d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<n; i++) 8393d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8394d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_color == MagickFalse) 8395d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8396d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != colormap[i].green || 8397d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[i].red != colormap[i].blue) 8398d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8399d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickTrue; 8400d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8401d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8402d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8403d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8404d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8405d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8406d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8407d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != 0 && colormap[i].red != QuantumRange) 8408d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8409d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8410d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 84113241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8412d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if ((mng_info->ping_exclude_tRNS == MagickFalse || 8413d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (number_transparent == 0 && number_semitransparent == 0)) && 8414d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (((mng_info->write_png_colortype-1) == 8415d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp PNG_COLOR_TYPE_PALETTE) || 8416d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (mng_info->write_png_colortype == 0))) 8417d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8418d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 84196185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 8420d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (n != (ssize_t) image_colors) 8421d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8422d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image_colors (%d) and n (%d) don't match", 8423d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors, n); 84242cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8425d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8426d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " AcquireImageColormap"); 8427d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8428d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8429d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colors = image_colors; 8430d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 843116ea139d53d867211d3bb0fa859a83de653f687ecristy if (AcquireImageColormap(image,image_colors,exception) == 8432d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp MagickFalse) 84333faa9a3fb01696daaf976d595f492cb530bffb21glennrp ThrowWriterException(ResourceLimitError, 84343faa9a3fb01696daaf976d595f492cb530bffb21glennrp "MemoryAllocationFailed"); 8435d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8436d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 8437d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colormap[i] = colormap[i]; 8438d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8439d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8440d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8441d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8442d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d (%d)", 8443d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colors, image_colors); 8444bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8445d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8446d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Update the pixel indexes"); 8447d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8448d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8449fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* Sync the pixel indices with the new colormap */ 8450fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8451d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8452d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 845316ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 84543c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 845516ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8456d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 84573c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8458d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8459d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8460d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 846103812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 8462d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if ((image->matte == MagickFalse || 846316ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha == GetPixelAlpha(image,q)) && 846416ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red == GetPixelRed(image,q) && 846516ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green == GetPixelGreen(image,q) && 846616ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue == GetPixelBlue(image,q)) 84676185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 846816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,i,q); 8469d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 84706185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 847103812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 847216ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8473d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8474d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8475d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8476d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8477d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8478d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8479d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8480d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8481d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8482d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8483d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8484d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d", (int) image->colors); 8485d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8486d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colormap != NULL) 8487d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8488d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 848916ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 849083c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8491d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < (ssize_t) image->colors; i++) 8492d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 849372988485e53441bbc7e5e7fbcb8e81012212efb6cristy if (i < 300 || i >= (ssize_t) image->colors - 10) 8494d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8495d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8496d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8497d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8498d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8499d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8500d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 850116ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8502d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85036185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 85046185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 85053c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8506d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 257) 8507d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8508d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent = %d", 8509d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent); 8510d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 85113c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8512d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8513d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent > 256"); 85143c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8515d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 257) 8516d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8517d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque = %d", 8518d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque); 851903812ae402fb53d548f0e1d7d14720768f803c2dglennrp 8520d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8521d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8522d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque > 256"); 85236185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8524d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 257) 8525d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8526d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent = %d", 8527d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent); 85286185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8529d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8530d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8531d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent > 256"); 8532a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8533d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8534d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8535d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are black or white"); 8536a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8537d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else if (ping_have_color == MagickFalse) 8538d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8539d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are gray"); 8540d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8541d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8542d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8543d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " At least one pixel or the background is non-gray"); 85446185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 854503812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 854603812ae402fb53d548f0e1d7d14720768f803c2dglennrp " Exit BUILD_PALETTE:"); 8547d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85483c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8549c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (mng_info->write_png8 == MagickFalse) 8550c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8551fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8552c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* Make any reductions necessary for the PNG8 format */ 8553c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors <= 256 && 8554c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image_colors != 0 && image->colormap != NULL && 8555c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_semitransparent == 0 && 8556c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_transparent <= 1) 8557c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8558fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8559c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have semitransparent colors so we threshold the 8560130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * opacity to 0 or OpaqueOpacity, and PNG8 can only have one 8561130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * transparent color so if more than one is transparent we merge 8562130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * them into image->background_color. 8563c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 8564130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp if (number_semitransparent != 0 || number_transparent > 1) 8565c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8566c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8567c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Thresholding the alpha channel to binary"); 8568fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8569c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 8570c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 857116ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8572fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 857316ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 8574c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8575fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8576c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 8577c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 857816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) < OpaqueAlpha/2) 85798ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 858016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelInfoPixel(image,&image->background_color,r); 858116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,r); 85828ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 85838ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 858416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,OpaqueAlpha,r); 858516ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 8586c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8587bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8588c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8589c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8590fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8591c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors != 0 && image_colors <= 256 && 8592c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image->colormap != NULL) 8593c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 859416ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha = 859516ea139d53d867211d3bb0fa859a83de653f687ecristy (image->colormap[i].alpha > TransparentAlpha/2 ? 859616ea139d53d867211d3bb0fa859a83de653f687ecristy TransparentAlpha : OpaqueAlpha); 8597c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8598c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 8599c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8600c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 8601c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have more than 256 colors so we quantize the pixels and 8602e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * background color to the 4-4-4-1, 3-3-3-1 or 3-3-2-1 palette. If the 8603e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * image is mostly gray, the 4-4-4-1 palette is likely to end up with 256 8604e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * colors or less. 8605c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 8606d337164012450d70d62e71cf4a308a29004f7d57glennrp if (tried_444 == MagickFalse && (image_colors == 0 || image_colors > 256)) 8607d337164012450d70d62e71cf4a308a29004f7d57glennrp { 8608d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 8609d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8610d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the background color to 4-4-4"); 8611d337164012450d70d62e71cf4a308a29004f7d57glennrp 8612d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickTrue; 8613d337164012450d70d62e71cf4a308a29004f7d57glennrp 861491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->background_color); 8615d337164012450d70d62e71cf4a308a29004f7d57glennrp 8616d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 8617d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8618d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the pixel colors to 4-4-4"); 8619d337164012450d70d62e71cf4a308a29004f7d57glennrp 8620d337164012450d70d62e71cf4a308a29004f7d57glennrp if (image->colormap == NULL) 8621d337164012450d70d62e71cf4a308a29004f7d57glennrp { 8622d337164012450d70d62e71cf4a308a29004f7d57glennrp for (y=0; y < (ssize_t) image->rows; y++) 8623d337164012450d70d62e71cf4a308a29004f7d57glennrp { 862416ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8625d337164012450d70d62e71cf4a308a29004f7d57glennrp 862616ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 8627d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 8628d337164012450d70d62e71cf4a308a29004f7d57glennrp 8629d337164012450d70d62e71cf4a308a29004f7d57glennrp for (x=0; x < (ssize_t) image->columns; x++) 8630d337164012450d70d62e71cf4a308a29004f7d57glennrp { 863116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 863254cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelRGB(r); 863316ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 8634d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8635bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8636d337164012450d70d62e71cf4a308a29004f7d57glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8637d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 8638d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8639d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8640d337164012450d70d62e71cf4a308a29004f7d57glennrp 8641d337164012450d70d62e71cf4a308a29004f7d57glennrp else /* Should not reach this; colormap already exists and 8642d337164012450d70d62e71cf4a308a29004f7d57glennrp must be <= 256 */ 8643d337164012450d70d62e71cf4a308a29004f7d57glennrp { 8644d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 8645d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8646d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the colormap to 4-4-4"); 86478e58efdecda887b08ef730d68290a61081ef2566glennrp 8648d337164012450d70d62e71cf4a308a29004f7d57glennrp for (i=0; i<image_colors; i++) 8649d337164012450d70d62e71cf4a308a29004f7d57glennrp { 865091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->colormap[i]); 8651d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8652d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8653d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 8654d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8655d337164012450d70d62e71cf4a308a29004f7d57glennrp 865682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (tried_333 == MagickFalse && (image_colors == 0 || image_colors > 256)) 865782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 865882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 865982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 866082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp " Quantizing the background color to 3-3-3"); 866182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 866282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickTrue; 866382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 866491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->background_color); 866582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 866682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 866782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8668e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-3-1"); 866982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 867082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (image->colormap == NULL) 867182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 867282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (y=0; y < (ssize_t) image->rows; y++) 867382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 867416ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 867582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 867616ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 867782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 867882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 867982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (x=0; x < (ssize_t) image->columns; x++) 868082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 868116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 868216ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03RGB(r); 868316ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 868482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 8685bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 868682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 868782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 868882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 868982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 869082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 869182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp else /* Should not reach this; colormap already exists and 869282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp must be <= 256 */ 869382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 869482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 869582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8696e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-3-1"); 869782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (i=0; i<image_colors; i++) 869882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 869991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->colormap[i]); 870082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 8701d337164012450d70d62e71cf4a308a29004f7d57glennrp } 8702d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 870382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 8704c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 87058ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (tried_332 == MagickFalse && (image_colors == 0 || image_colors > 256)) 8706c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8707c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 8708c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8709c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Quantizing the background color to 3-3-2"); 8710c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 87118ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickTrue; 87128ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 87133faa9a3fb01696daaf976d595f492cb530bffb21glennrp /* Red and green were already done so we only quantize the blue 87143faa9a3fb01696daaf976d595f492cb530bffb21glennrp * channel 87153faa9a3fb01696daaf976d595f492cb530bffb21glennrp */ 87163faa9a3fb01696daaf976d595f492cb530bffb21glennrp 871791d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->background_color); 8718fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8719c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 8720c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8721e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-2-1"); 8722fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8723c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image->colormap == NULL) 8724c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8725c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 8726c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 872716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 87288d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 872916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 8730c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8731c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 8732c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 8733c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 873416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 873554cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelBlue(r); 873616ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 8737c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8738bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8739c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8740c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8741c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8742c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8743c722dd852e8abe407c2846d39662f7ade9c234deglennrp 8744c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp else /* Should not reach this; colormap already exists and 8745c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp must be <= 256 */ 8746c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8747c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 8748c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8749e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-2-1"); 8750c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 8751c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 875291d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->colormap[i]); 8753c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8754c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8755c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 8756c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8757c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 87588ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 87598ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image_colors == 0 || image_colors > 256) 87608ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 87618ca51ad2da164dabc55b192ed7884b745fde0e26glennrp /* Take care of special case with 256 colors + 1 transparent 87628ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * color. We don't need to quantize to 2-3-2-1; we only need to 87638ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * eliminate one color, so we'll merge the two darkest red 87648ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * colors (0x49, 0, 0) -> (0x24, 0, 0). 87658ca51ad2da164dabc55b192ed7884b745fde0e26glennrp */ 87668ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->background_color.red) == 0x49 && 87678ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.green) == 0x00 && 87688ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.blue) == 0x00) 87698ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 87708ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->background_color.red=ScaleCharToQuantum(0x24); 87718ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 8772bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 87738ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image->colormap == NULL) 87748ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 87758ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (y=0; y < (ssize_t) image->rows; y++) 87768ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 877716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8778bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 877916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 87808ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 8781bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 87828ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (x=0; x < (ssize_t) image->columns; x++) 87838ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 878416ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToChar(GetPixelRed(image,r)) == 0x49 && 878516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelGreen(image,r)) == 0x00 && 878616ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,r)) == 0x00 && 878716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,r) == OpaqueAlpha) 87888ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 878916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleCharToQuantum(0x24),r); 87908ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 879116ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 87928ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 8793bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 87948ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 87958ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 8796bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 87978ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 87988ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 87998ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 88008ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 88018ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 88028ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (i=0; i<image_colors; i++) 88038ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 88048ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->colormap[i].red) == 0x49 && 88058ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].green) == 0x00 && 88068ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].blue) == 0x00) 88078ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 88088ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->colormap[i].red=ScaleCharToQuantum(0x24); 88098ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 88108ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 88118ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 88128ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 8813fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8814fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* END OF BUILD_PALETTE */ 8815fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8816fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* If we are excluding the tRNS chunk and there is transparency, 8817fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * then we must write a Gray-Alpha (color-type 4) or RGBA (color-type 6) 8818fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * PNG. 8819fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 88200e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (mng_info->ping_exclude_tRNS != MagickFalse && 88210e8ea19baa0666ccfe869d19116372f60fe9230fglennrp (number_transparent != 0 || number_semitransparent != 0)) 88220e8ea19baa0666ccfe869d19116372f60fe9230fglennrp { 8823d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp unsigned int colortype=mng_info->write_png_colortype; 88240e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 88250e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (ping_have_color == MagickFalse) 88260e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 5; 88270e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 88280e8ea19baa0666ccfe869d19116372f60fe9230fglennrp else 88290e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 7; 88300e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 88318d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (colortype != 0 && 8832d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp mng_info->write_png_colortype != colortype) 88330e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning=MagickTrue; 88340b206f5daa453dc1035db5890cabc899736dc2d0glennrp 88350e8ea19baa0666ccfe869d19116372f60fe9230fglennrp } 88360e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 8837fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* See if cheap transparency is possible. It is only possible 8838fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * when there is a single transparent color, no semitransparent 8839fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * color, and no opaque color that has the same RGB components 88405a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * as the transparent color. We only need this information if 88415a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * we are writing a PNG with colortype 0 or 2, and we have not 88425a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * excluded the tRNS chunk. 8843fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 88445a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp if (number_transparent == 1 && 88455a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp mng_info->write_png_colortype < 4) 8846fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8847fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickTrue; 8848fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8849fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (number_semitransparent != 0) 8850fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 8851fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8852fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else if (image_colors == 0 || image_colors > 256 || 8853fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp image->colormap == NULL) 8854fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 885516ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 8856fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *q; 8857fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8858fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (y=0; y < (ssize_t) image->rows; y++) 8859fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8860fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp q=GetVirtualPixels(image,0,y,image->columns,1, exception); 8861fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 886216ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8863fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 8864fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8865fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (x=0; x < (ssize_t) image->columns; x++) 8866fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 886716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != TransparentAlpha && 886816ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelRed(image,q) == 886916ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red && 887016ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelGreen(image,q) == 887116ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green && 887216ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelBlue(image,q) == 887316ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue) 8874fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8875fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 8876fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 8877fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8878fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 887916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8880fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8881bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8882fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 8883fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 8884fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8885fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8886fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 8887fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 888867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* Assuming that image->colormap[0] is the one transparent color 888967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * and that all others are opaque. 889067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp */ 8891fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image_colors > 1) 889267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp for (i=1; i<image_colors; i++) 889367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->colormap[i].red == image->colormap[0].red && 889467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].green == image->colormap[0].green && 889567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].blue == image->colormap[0].blue) 8896fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 889767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp ping_have_cheap_transparency = MagickFalse; 889867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp break; 8899fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8900fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8901bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8902fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 8903fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8904fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 8905fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8906fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is not possible."); 8907fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8908fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 8909fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8910fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is possible."); 8911fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8912fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 8913fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 8914fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 8915fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 89163c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp image_depth=image->depth; 89173c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 89183c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp quantum_info = (QuantumInfo *) NULL; 89193c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp number_colors=0; 8920f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) image->colors; 89213c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp image_matte=image->matte; 892283c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 89230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->IsPalette=image->storage_class == PseudoClass && 89241273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp image_colors <= 256 && image->colormap != NULL; 89253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 892652a479ca718756af72f96e127f8256499ab68f76glennrp if ((mng_info->write_png_colortype == 4 || mng_info->write_png8) && 892752a479ca718756af72f96e127f8256499ab68f76glennrp (image->colors == 0 || image->colormap == NULL)) 892852a479ca718756af72f96e127f8256499ab68f76glennrp { 892916ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 893016ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 893116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 893215e0155e1d2502703b937a3454bd7907e6fd8dc7glennrp "Cannot write PNG8 or color-type 3; colormap is NULL", 893316ea139d53d867211d3bb0fa859a83de653f687ecristy "`%s'",IMimage->filename); 893452a479ca718756af72f96e127f8256499ab68f76glennrp return(MagickFalse); 893552a479ca718756af72f96e127f8256499ab68f76glennrp } 893652a479ca718756af72f96e127f8256499ab68f76glennrp 89373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 89383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 89393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 894116ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.image=image; 894216ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.exception=exception; 894316ea139d53d867211d3bb0fa859a83de653f687ecristy ping=png_create_write_struct_2(PNG_LIBPNG_VER_STRING,&error_info, 8944cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler,(void *) NULL, 8945cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); 89460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 89473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 894816ea139d53d867211d3bb0fa859a83de653f687ecristy ping=png_create_write_struct(PNG_LIBPNG_VER_STRING,&error_info, 8949cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler); 89500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 89513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 89523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 89533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 89540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 89553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 89560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 89573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 89583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 89593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,(png_info **) NULL); 89603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 89613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 89620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 89633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_write_fn(ping,image,png_put_data,png_flush_data); 8964cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) NULL; 89653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 89665af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (setjmp(png_jmpbuf(ping))) 89673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 89683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 89693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG write failed. 89703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 89713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_DEBUG 89723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 89733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("PNG write has failed.\n"); 89743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 89753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 8976edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 8977cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 89783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8979edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 8980edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp if (ping_pixels != (unsigned char *) NULL) 8981edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp ping_pixels=(unsigned char *) RelinquishMagickMemory(ping_pixels); 8982edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 8983edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp if (quantum_info != (QuantumInfo *) NULL) 8984edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp quantum_info=DestroyQuantumInfo(quantum_info); 8985edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 898616ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 898716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 898816ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 898916ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 89903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 89913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 8992edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 8993edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* { For navigation to end of SETJMP-protected block. Within this 8994edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * block, use png_error() instead of Throwing an Exception, to ensure 8995edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * that libpng is able to clean up, and that the semaphore is unlocked. 8996edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 8997edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 8998edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 8999edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp LockSemaphoreInfo(ping_semaphore); 9000edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 9001edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 90023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 90033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for writing. 90043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 90059bf97b6c2143eb20c330346b01e82102cc082725glennrp 90063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 90073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 900825024a6b81adca7509dfd90b03c27dbb42c5889bglennrp { 90093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 901025024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED 901125024a6b81adca7509dfd90b03c27dbb42c5889bglennrp /* Disable new libpng-1.5.10 feature when writing a MNG because 901225024a6b81adca7509dfd90b03c27dbb42c5889bglennrp * zero-length PLTE is OK 901325024a6b81adca7509dfd90b03c27dbb42c5889bglennrp */ 901425024a6b81adca7509dfd90b03c27dbb42c5889bglennrp png_set_check_for_invalid_index (ping, 0); 901525024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# endif 901625024a6b81adca7509dfd90b03c27dbb42c5889bglennrp } 90172b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 90183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 90193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 90203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 90213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 90222b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 90233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 90243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 90252b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 90263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x=0; 90272b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 90284e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_width=(png_uint_32) image->columns; 90294e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_height=(png_uint_32) image->rows; 90302b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 90313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) 90323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 90330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 90343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth != 0) 90353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=mng_info->write_png_depth; 90360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 90373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Adjust requested depth to next higher valid depth if necessary */ 90383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 90393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=16; 90400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 90413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_depth > 4) && (image_depth < 8)) 90423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 90430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 90443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 3) 90453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=4; 90460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 90473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 90483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9050e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " width=%.20g",(double) ping_width); 90513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9052e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " height=%.20g",(double) ping_height); 90533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9054e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_matte=%.20g",(double) image->matte); 90553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90568640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth=%.20g",(double) image->depth); 90573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 90588640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Tentative ping_bit_depth=%.20g",(double) image_depth); 90593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 90608640fb5e9b1094f35f8beab436f81661b8a99448glennrp 90613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth=image_depth; 90625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=(png_byte) save_image_depth; 9063dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 906426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 90653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 906626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 906726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 906816ea139d53d867211d3bb0fa859a83de653f687ecristy if ((image->resolution.x != 0) && (image->resolution.y != 0) && 90693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_mng || !mng_info->equal_physs)) 90703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 90710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 9072dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9073dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp " Setting up pHYs chunk"); 90743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 90753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 90763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9077dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 9078823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_x_resolution= 907916ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.x+0.5)/2.54); 9080823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_y_resolution= 908116ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.y+0.5)/2.54); 90823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9083dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 90843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (image->units == PixelsPerCentimeterResolution) 90853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9086dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 908716ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) (100.0*image->resolution.x+0.5); 908816ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) (100.0*image->resolution.y+0.5); 90893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9090991d11dd9c33e65872778b81aff1347cd2878154glennrp 90913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 90923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9093dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_UNKNOWN; 909416ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) image->resolution.x; 909516ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) image->resolution.y; 90963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9097991d11dd9c33e65872778b81aff1347cd2878154glennrp 9098823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (logging != MagickFalse) 9099823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9100823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Set up PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 9101823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (double) ping_pHYs_x_resolution,(double) ping_pHYs_y_resolution, 9102823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (int) ping_pHYs_unit_type); 9103991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs = MagickTrue; 91043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 910526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 91063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9107a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 910826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 910926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 9110a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if ((!mng_info->adjoin || !mng_info->equal_backgrounds)) 91113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9112a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp unsigned int 9113a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask; 9114a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 9115a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0xffff; 9116a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 8) 9117a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x00ff; 91180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9119a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 4) 9120a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x000f; 91210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9122a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 2) 9123a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0003; 91240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9125a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 1) 9126a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0001; 91270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9128a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.red=(png_uint_16) 9129a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.red) & mask); 91300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9131a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.green=(png_uint_16) 9132a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.green) & mask); 91330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9134a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.blue=(png_uint_16) 9135a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.blue) & mask); 9136c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9137c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.gray=(png_uint_16) ping_background.green; 91380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 91390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 91413b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp { 91423b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 91433b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Setting up bKGD chunk (1)"); 9144c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9145c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9146c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 91473b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 91483b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 91493b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " ping_bit_depth=%d",ping_bit_depth); 91503b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp } 91510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 915326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 91543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 91563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Select the color type. 91573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 91583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 91593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_bit_depth=0; 91600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91611273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && mng_info->write_png8) 91623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 91630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9164fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: make this a function cause it's used twice, except 91650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for reducing the sample depth from 8. */ 91660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp number_colors=image_colors; 91688bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 91698bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickFalse; 91700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 91720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Set image palette. 91730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 91740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 91750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 91770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 91780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up PLTE chunk with %d colors (%d)", 9179f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, image_colors); 91800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 91810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (i=0; i < (ssize_t) number_colors; i++) 91820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 91830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 91840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 91850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 91860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 91870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 918867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if MAGICKCORE_QUANTUM_DEPTH == 8 91890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " %3ld (%3d,%3d,%3d)", 919067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#else 919167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp " %5ld (%5d,%5d,%5d)", 919267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#endif 91930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (long) i,palette[i].red,palette[i].green,palette[i].blue); 91943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 91950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 91962b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 91978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_PLTE=MagickTrue; 91988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=ping_bit_depth; 91998bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_num_trans=0; 92005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 920158e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 92028bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 92030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 92040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Identify which colormap entry is transparent. 92050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 92060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 92078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp assert(image->colormap != NULL); 92083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 92098bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (i=0; i < (ssize_t) number_transparent; i++) 92108bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_trans_alpha[i]=0; 92110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92132cc891a179d622dde7bbb8854138851e828bc6eaglennrp ping_num_trans=(unsigned short) (number_transparent + 92148bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent); 92150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 92170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 92180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 92208bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickTrue; 92218bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 92220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92231273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (ping_exclude_bKGD == MagickFalse) 92244f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 92251273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp /* 92261273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp * Identify which colormap entry is the background color. 92271273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp */ 92281273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp 92294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) 92304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (IsPNGColorEqual(ping_background,image->colormap[i])) 92314f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 92320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_background.index=(png_byte) i; 9234c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9235c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 9236c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 9237c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9238c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9239c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 9240c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 92414f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 92423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* end of write_png8 */ 92430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92447e65e93c71716f2a5c03c0808adedae21d519fb2glennrp else if (mng_info->write_png24 || mng_info->write_png_colortype == 3) 92453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 92475af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 92483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92507e65e93c71716f2a5c03c0808adedae21d519fb2glennrp else if (mng_info->write_png32 || mng_info->write_png_colortype == 7) 92513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 92535af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 92543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92568bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* mng_info->write_pngNN not specified */ 92573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92585af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 92590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92608bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->write_png_colortype != 0) 92613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) mng_info->write_png_colortype-1; 92630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92645af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 92655af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 92663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 92672cc891a179d622dde7bbb8854138851e828bc6eaglennrp 92688bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 92698bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_matte=MagickFalse; 92707c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 92717c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (logging != MagickFalse) 92727c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 92737c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp " PNG colortype %d was specified:",(int) ping_color_type); 92743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92767c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else /* write_png_colortype not specified */ 92773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 92793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 92803c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp " Selecting PNG colortype:"); 92810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9282d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_color_type=(png_byte) ((matte != MagickFalse)? 92838bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp PNG_COLOR_TYPE_RGB_ALPHA:PNG_COLOR_TYPE_RGB); 92840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9285d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (image_info->type == TrueColorType) 92863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 92883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 92893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9291d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (image_info->type == TrueColorMatteType) 92923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 92935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 92943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 92953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 92960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 92975aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_info->type == PaletteType || 92985aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_info->type == PaletteMatteType) 92995aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 93005aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 93017c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0 && 93027c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp (image_info->type == UndefinedType || 93037c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp image_info->type == OptimizeType)) 93043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93055aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (ping_have_color == MagickFalse) 93068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 93075aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 93085aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 93095aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 93105aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 93115aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 93120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93130b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 93145aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 93155aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY_ALPHA; 93165aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 93175aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 93188bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 93195aa37f69df93407ddf94afdfd2504f708d8b3242glennrp else 93205aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 93215aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 93225aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 93235aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 93245aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 93255aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 93268bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 93270b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 93285aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 93295aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGBA; 93305aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 93315aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 93325aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 93330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 93345aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 93353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 933826c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 93398640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Selected PNG colortype=%d",ping_color_type); 934026c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp 93415af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 93420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 93430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 93440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB || 93450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 93460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=8; 93470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 93483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9349d6bf1617e99df0272b231855a933a74e99b6578fglennrp old_bit_depth=ping_bit_depth; 9350d6bf1617e99df0272b231855a933a74e99b6578fglennrp 93515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93538d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (image->matte == MagickFalse && ping_have_non_bw == MagickFalse) 93548d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_bit_depth=1; 93553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93568640fb5e9b1094f35f8beab436f81661b8a99448glennrp 93575af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 93583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 935935ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one = 1; 93605af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 93610f111984738842d27d04aed2a3f823d82a943506glennrp 93620f111984738842d27d04aed2a3f823d82a943506glennrp if (image->colors == 0) 93630f111984738842d27d04aed2a3f823d82a943506glennrp { 93640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* DO SOMETHING */ 9365edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"image has 0 colors"); 93660f111984738842d27d04aed2a3f823d82a943506glennrp } 93670f111984738842d27d04aed2a3f823d82a943506glennrp 936835ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) < (ssize_t) image_colors) 93695af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 9370d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9372d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (logging != MagickFalse) 9373d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 9374d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9375d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Number of colors: %.20g",(double) image_colors); 93760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9377d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9378d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Tentative PNG bit depth: %d",ping_bit_depth); 9379d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 93800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9381d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (ping_bit_depth < (int) mng_info->write_png_depth) 9382d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_bit_depth = mng_info->write_png_depth; 93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93842cc891a179d622dde7bbb8854138851e828bc6eaglennrp 93855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 93862b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 93901a56e9c9268976936eeab9fe97eb664b847e444cglennrp " Tentative PNG color type: %s (%.20g)", 93911a56e9c9268976936eeab9fe97eb664b847e444cglennrp PngColorTypeToString(ping_color_type), 93921a56e9c9268976936eeab9fe97eb664b847e444cglennrp (double) ping_color_type); 93930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9395e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_info->type: %.20g",(double) image_info->type); 93960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9398e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_depth: %.20g",(double) image_depth); 93990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 94013c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 94028640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth: %.20g",(double) image->depth); 94038640fb5e9b1094f35f8beab436f81661b8a99448glennrp 94048640fb5e9b1094f35f8beab436f81661b8a99448glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9405e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " ping_bit_depth: %.20g",(double) ping_bit_depth); 94063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 940858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 94093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94104f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (mng_info->IsPalette) 94114f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94127c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 94137c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp { 94147c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 94152b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94167c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (ping_have_color != MagickFalse) 94177c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_RGBA; 94187c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp } 94192b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94214f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp * Determine if there is any transparent color. 94223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94234f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (number_transparent + number_semitransparent == 0) 94244f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94254f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 94264f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp No transparent pixels are present. Change 4 or 6 to 0 or 2. 94274f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp */ 9428a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 94294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image_matte=MagickFalse; 94307c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 94317c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 94327c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type&=0x03; 94334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94354f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 94364f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94374f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp unsigned int 9438bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp mask; 94393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 94404f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0xffff; 94410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94424f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 8) 94434f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x00ff; 94440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94454f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 4) 94464f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x000f; 94470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94484f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 2) 94494f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0003; 94500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94514f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 1) 94524f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0001; 94530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94544f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red=(png_uint_16) 94554f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].red) & mask); 94560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94574f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green=(png_uint_16) 94584f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].green) & mask); 94590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94604f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue=(png_uint_16) 94614f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].blue) & mask); 94620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94634f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray=(png_uint_16) 946416ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToShort(GetPixelInfoIntensity( 94654f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image->colormap)) & mask); 94660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94674f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.index=(png_byte) 0; 94680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94694f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_have_tRNS=MagickTrue; 94704f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94724f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 94734f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94744f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 9475fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * Determine if there is one and only one transparent color 9476fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * and if so if it is fully transparent. 9477fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 9478fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9479fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_tRNS=MagickFalse; 94804f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94812b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94824f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 94834f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94847c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 94857c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type &= 0x03; /* changes 4 or 6 to 0 or 2 */ 94860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94874f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (image_depth == 8) 94884f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94894f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red&=0xff; 94904f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green&=0xff; 94914f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue&=0xff; 94924f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray&=0xff; 94934f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94944f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94954f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 94964f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 94974f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 94983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 8) 94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red&=0xff; 95015af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green&=0xff; 95025af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue&=0xff; 95035af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray&=0xff; 95043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95078640fb5e9b1094f35f8beab436f81661b8a99448glennrp 95083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 95090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95102e09f55407bbe197cbaf4f88b1d7265f62d7f6c7glennrp if (ping_have_tRNS != MagickFalse) 95113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 95120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 951339992b4dd9b12ef752d55b8e402c069698851f72glennrp if ((mng_info->IsPalette) && 95143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE && 95158d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_color == MagickFalse && 95168d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp (image_matte == MagickFalse || image_depth >= 8)) 95173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 951835ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one=1; 95190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte != MagickFalse) 95219c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 95220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95237c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_GRAY_ALPHA) 95243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95255af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=PNG_COLOR_TYPE_GRAY; 95264f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (save_image_depth == 16 && image_depth == 8) 95284f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 95294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 95304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 95314f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95324f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color (0)"); 95334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 95344f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray*=0x0101; 95354f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > MAGICKCORE_QUANTUM_DEPTH) 95393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=MAGICKCORE_QUANTUM_DEPTH; 95400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9541136ee3aa5987c7418c835f7ee741e1af1dadb113glennrp if ((image_colors == 0) || 9542d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp ((ssize_t) (image_colors-1) > (ssize_t) MaxColormapSize)) 9543f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) (one << image_depth); 95440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 95465af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=16; 95470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 95493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 95515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 95523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(!mng_info->write_png_depth) 95543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95555af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 95560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 955735ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) 9558bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy < (ssize_t) image_colors) 95595af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 95603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95622b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 95630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == 95640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp PNG_COLOR_TYPE_GRAY && image_colors < 17 && 95653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette) 95663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if grayscale is reducible */ 95681a0aaa639fb2360f2db93f9b0ed2b42ef6d2106dglennrp 95693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 95703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=MagickTrue, 95713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=MagickTrue, 95723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickTrue; 95733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9574bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image_colors; i++) 95753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 95773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity; 95783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity=ScaleQuantumToChar(image->colormap[i].red); 95803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((intensity & 0x0f) != ((intensity & 0xf0) >> 4)) 95823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=depth_2_ok=depth_1_ok=MagickFalse; 95833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if ((intensity & 0x03) != ((intensity & 0x0c) >> 2)) 95843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=depth_1_ok=MagickFalse; 95854bf89731a90c6e03598950223e19e7be7b95d630glennrp else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) 95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickFalse; 95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95882b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth_1_ok && mng_info->write_png_depth <= 1) 95909c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=1; 95910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_2_ok && mng_info->write_png_depth <= 2) 95939c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=2; 95940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_4_ok && mng_info->write_png_depth <= 4) 95969c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=4; 95973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95992b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 96005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 960717a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 960817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 96093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth <= 8) 96103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image palette. 96133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 96145af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 96150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 961658e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (mng_info->have_write_global_plte && matte == MagickFalse) 96173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96189c1eb0729653219b9da9037e044501a6dce79d10glennrp png_set_PLTE(ping,ping_info,NULL,0); 96190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96203b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 96219c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 96229c1eb0729653219b9da9037e044501a6dce79d10glennrp " Setting up empty PLTE chunk"); 96233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9627bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 96283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 96303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 96313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 96323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96343b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 96353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 963698156a3a465a004545e39434c63052b955a74d1cglennrp " Setting up PLTE chunk with %d colors", 9637f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors); 96380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 963939992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickTrue; 96403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* color_type is PNG_COLOR_TYPE_PALETTE */ 9643d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (mng_info->write_png_depth == 0) 96443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9645befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 9646befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 9647befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 96485af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 9649befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 96500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 965116ea139d53d867211d3bb0fa859a83de653f687ecristy while ((one << ping_bit_depth) < (size_t) number_colors) 96525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 96533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96555af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 96560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 965758e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 96580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 96590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 9660d6bf1617e99df0272b231855a933a74e99b6578fglennrp * Set up trans_colors array. 9661d6bf1617e99df0272b231855a933a74e99b6578fglennrp */ 96620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 96633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9664d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_num_trans=(unsigned short) (number_transparent + 9665d6bf1617e99df0272b231855a933a74e99b6578fglennrp number_semitransparent); 96663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 96680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 96690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9670d6bf1617e99df0272b231855a933a74e99b6578fglennrp else 96710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 9672c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 9673c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 9674c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9675c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Scaling ping_trans_color (1)"); 9676c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 9677d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_tRNS=MagickTrue; 9678d6bf1617e99df0272b231855a933a74e99b6578fglennrp 9679d6bf1617e99df0272b231855a933a74e99b6578fglennrp for (i=0; i < ping_num_trans; i++) 9680d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 9681750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp ping_trans_alpha[i]= (png_byte) 968216ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(image->colormap[i].alpha); 9683d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 96840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 96850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 96863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 96903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9691c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 96923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth < 8) 96933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 96940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((save_image_depth == 16) && (image_depth == 8)) 96963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96974f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 96984f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 96994f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97004f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color from (%d,%d,%d)", 97014f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 97024f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 97034f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 97044f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 97054f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 97065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red*=0x0101; 97075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green*=0x0101; 97085af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue*=0x0101; 97095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray*=0x0101; 97104f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 97114f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 97124f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 97134f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97144f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " to (%d,%d,%d)", 97154f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 97164f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 97174f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 97184f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 97193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97224383ec8c3c8811128f5a8a034d67c47db5e7e75acristy if (ping_bit_depth < (ssize_t) mng_info->write_png_depth) 97234383ec8c3c8811128f5a8a034d67c47db5e7e75acristy ping_bit_depth = (ssize_t) mng_info->write_png_depth; 97242cc891a179d622dde7bbb8854138851e828bc6eaglennrp 97253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 97263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Adjust background and transparency samples in sub-8-bit grayscale files. 97273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 97285af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8 && ping_color_type == 97293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_GRAY) 97303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 97323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval; 97333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 973435ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 973535ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 973635ef824baa82511126ff0072ae30eee0da9c05a3cristy 973722ffd97a7a54140ebcfe886af90cbdb7bfe41e89cristy maxval=(png_uint_16) ((one << ping_bit_depth)-1); 97383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97394f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_bKGD == MagickFalse) 974026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 97413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 974216ea139d53d867211d3bb0fa859a83de653f687ecristy ping_background.gray=(png_uint_16) ((maxval/65535.)* 974316ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToShort(((GetPixelInfoIntensity( 974416ea139d53d867211d3bb0fa859a83de653f687ecristy &image->background_color))) +.5))); 974516ea139d53d867211d3bb0fa859a83de653f687ecristy 97463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97478f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 974816ea139d53d867211d3bb0fa859a83de653f687ecristy " Setting up bKGD chunk (2)"); 974916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 975016ea139d53d867211d3bb0fa859a83de653f687ecristy " background_color index is %d", 975116ea139d53d867211d3bb0fa859a83de653f687ecristy (int) ping_background.index); 97523b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 9753991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD = MagickTrue; 975426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 97553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 97563e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 97573e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97583e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " Scaling ping_trans_color.gray from %d", 97593e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (int)ping_trans_color.gray); 97603e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 97619be9b1cfe4c5ead507b2ad633cced4321db3c806glennrp ping_trans_color.gray=(png_uint_16) ((maxval/255.)*( 97623e3e20f27f74686a93873f25b015e0e8e40f451dglennrp ping_trans_color.gray)+.5); 97633e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 97643e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 97653e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97663e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " to %d", (int)ping_trans_color.gray); 97673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 976817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 976926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 977026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 97711273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && (int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 977217a1485544c62993fc7a94e343c87fed5f3e6407glennrp { 977317a1485544c62993fc7a94e343c87fed5f3e6407glennrp /* 977417a1485544c62993fc7a94e343c87fed5f3e6407glennrp Identify which colormap entry is the background color. 977517a1485544c62993fc7a94e343c87fed5f3e6407glennrp */ 977617a1485544c62993fc7a94e343c87fed5f3e6407glennrp 977717a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 977817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 9779a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors,1L); i++) 9780a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (IsPNGColorEqual(image->background_color,image->colormap[i])) 978117a1485544c62993fc7a94e343c87fed5f3e6407glennrp break; 978217a1485544c62993fc7a94e343c87fed5f3e6407glennrp 978317a1485544c62993fc7a94e343c87fed5f3e6407glennrp ping_background.index=(png_byte) i; 978417a1485544c62993fc7a94e343c87fed5f3e6407glennrp 97853b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 97860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 97870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up bKGD chunk with index=%d",(int) i); 97890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 9790a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 979113d07043243e0c8c151aad7db5240b75e76ca281cristy if (i < (ssize_t) number_colors) 9792a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp { 97930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 97943b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 97953b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 97960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 97970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " background =(%d,%d,%d)", 97990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.red, 98000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.green, 98010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.blue); 98020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 9803a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp } 980417a1485544c62993fc7a94e343c87fed5f3e6407glennrp 9805d6bf1617e99df0272b231855a933a74e99b6578fglennrp else /* Can't happen */ 98063c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp { 98073b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 98083b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98093b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " No room in PLTE to add bKGD color"); 98103c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp ping_have_bKGD = MagickFalse; 98113c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp } 981217a1485544c62993fc7a94e343c87fed5f3e6407glennrp } 981326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 981417a1485544c62993fc7a94e343c87fed5f3e6407glennrp 98153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 98163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98171a56e9c9268976936eeab9fe97eb664b847e444cglennrp " PNG color type: %s (%d)", PngColorTypeToString(ping_color_type), 98181a56e9c9268976936eeab9fe97eb664b847e444cglennrp ping_color_type); 98193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 98203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize compression level and filtering. 98213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 98223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 98230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 98240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up deflate compression"); 98260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Compression buffer size: 32768"); 98290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 98300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_buffer_size(ping,32768L); 98320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 98343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression mem level: 9"); 98360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98374054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_compression_mem_level(ping, 9); 98384054bfbdca478fe065f01d7f8285f7c173ccfcfccristy 983910d739ef54404090a55cb8977fc51f85cafa81a5glennrp /* Untangle the "-quality" setting: 984010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 984110d739ef54404090a55cb8977fc51f85cafa81a5glennrp Undefined is 0; the default is used. 984210d739ef54404090a55cb8977fc51f85cafa81a5glennrp Default is 75 984310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 984410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10's digit: 984510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 984610d739ef54404090a55cb8977fc51f85cafa81a5glennrp 0: Use Z_HUFFMAN_ONLY strategy with the 984710d739ef54404090a55cb8977fc51f85cafa81a5glennrp zlib default compression level 984810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 984910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1-9: the zlib compression level 985010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 985110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1's digit: 985210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 985310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 0-4: the PNG filter method 985410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 985510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 5: libpng adaptive filtering if compression level > 5 985610d739ef54404090a55cb8977fc51f85cafa81a5glennrp libpng filter type "none" if compression level <= 5 985710d739ef54404090a55cb8977fc51f85cafa81a5glennrp or if image is grayscale or palette 9858750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 985910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 6: libpng adaptive filtering 986010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 986110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 7: "LOCO" filtering (intrapixel differing) if writing 986210d739ef54404090a55cb8977fc51f85cafa81a5glennrp a MNG, othewise "none". Did not work in IM-6.7.0-9 986310d739ef54404090a55cb8977fc51f85cafa81a5glennrp and earlier because of a missing "else". 986410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 986510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 8: Z_RLE strategy, all filters 98661868258559ddf946fa73ef72dd43507b32623705glennrp Unused prior to IM-6.7.0-10, was same as 6 986710d739ef54404090a55cb8977fc51f85cafa81a5glennrp 986810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 9: Z_RLE strategy, no PNG filters 98691868258559ddf946fa73ef72dd43507b32623705glennrp Unused prior to IM-6.7.0-10, was same as 6 987010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 987110d739ef54404090a55cb8977fc51f85cafa81a5glennrp Note that using the -quality option, not all combinations of 987210d739ef54404090a55cb8977fc51f85cafa81a5glennrp PNG filter type, zlib compression level, and zlib compression 987316ea139d53d867211d3bb0fa859a83de653f687ecristy strategy are possible. This will be addressed soon in a 987416ea139d53d867211d3bb0fa859a83de653f687ecristy release that accomodates "-define png:compression-strategy", etc. 987510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 987610d739ef54404090a55cb8977fc51f85cafa81a5glennrp */ 987710d739ef54404090a55cb8977fc51f85cafa81a5glennrp 98783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality=image->quality == UndefinedCompressionQuality ? 75UL : 98793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->quality; 98800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98811868258559ddf946fa73ef72dd43507b32623705glennrp if (quality <= 9) 98821868258559ddf946fa73ef72dd43507b32623705glennrp { 98831868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 98841868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 98851868258559ddf946fa73ef72dd43507b32623705glennrp } 9886750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 98871868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_level == 0) 98883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 98893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 98903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy level; 98913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9892bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy level=(int) MagickMin((ssize_t) quality/10,9); 98930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98941868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = level+1; 98951868258559ddf946fa73ef72dd43507b32623705glennrp } 98960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98971868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 98981868258559ddf946fa73ef72dd43507b32623705glennrp { 98991868258559ddf946fa73ef72dd43507b32623705glennrp if ((quality %10) == 8 || (quality %10) == 9) 99001868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy=Z_RLE; 99013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99031868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 0) 99041868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter=((int) quality % 10) + 1; 99051868258559ddf946fa73ef72dd43507b32623705glennrp 99061868258559ddf946fa73ef72dd43507b32623705glennrp if (logging != MagickFalse) 99073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99081868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level) 99093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99101868258559ddf946fa73ef72dd43507b32623705glennrp " Compression level: %d", 99111868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_level-1); 99120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99131868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy) 99141868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99151868258559ddf946fa73ef72dd43507b32623705glennrp " Compression strategy: %d", 99161868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_strategy-1); 99170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99181868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99191868258559ddf946fa73ef72dd43507b32623705glennrp " Setting up filtering"); 99203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 99214054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png_compression_filter == 6) 992210d739ef54404090a55cb8977fc51f85cafa81a5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99231868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: ADAPTIVE"); 99244054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 0 || 99254054bfbdca478fe065f01d7f8285f7c173ccfcfccristy mng_info->write_png_compression_filter == 1) 99261868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99271868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: NONE"); 99281868258559ddf946fa73ef72dd43507b32623705glennrp else 99291868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99301868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: %d", 99311868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_filter-1); 99323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99341868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level != 0) 99351868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_level(ping,mng_info->write_png_compression_level-1); 99360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99371868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 6) 99381868258559ddf946fa73ef72dd43507b32623705glennrp { 99391868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 99401868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 99411868258559ddf946fa73ef72dd43507b32623705glennrp (quality < 50)) 99421868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 99431868258559ddf946fa73ef72dd43507b32623705glennrp else 99441868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 99451868258559ddf946fa73ef72dd43507b32623705glennrp } 99464054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 7 || 99471868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter == 10) 99481868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 994910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 99501868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 8) 99511868258559ddf946fa73ef72dd43507b32623705glennrp { 99521868258559ddf946fa73ef72dd43507b32623705glennrp#if defined(PNG_MNG_FEATURES_SUPPORTED) && defined(PNG_INTRAPIXEL_DIFFERENCING) 99531868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_mng) 99541868258559ddf946fa73ef72dd43507b32623705glennrp { 99551868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_RGB) || 99561868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_RGBA)) 99571868258559ddf946fa73ef72dd43507b32623705glennrp ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING; 99581868258559ddf946fa73ef72dd43507b32623705glennrp } 99591868258559ddf946fa73ef72dd43507b32623705glennrp#endif 99604054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 99611868258559ddf946fa73ef72dd43507b32623705glennrp } 99620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99631868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 9) 99641868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 99650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99661868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter != 0) 99671868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE, 99681868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter-1); 99690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99701868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy != 0) 99711868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_strategy(ping, 99721868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy-1); 99732b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 99740d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Only write the iCCP chunk if we are not writing the sRGB chunk. */ 99750d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (ping_exclude_sRGB != MagickFalse || 99760d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy (image->rendering_intent == UndefinedIntent)) 99770d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 99780d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((ping_exclude_tEXt == MagickFalse || 99790d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ping_exclude_zTXt == MagickFalse) && 99800d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse)) 9981c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 9982c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ResetImageProfileIterator(image); 9983c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 99843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9985c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp profile=GetImageProfile(image,name); 99860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9987c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (profile != (StringInfo *) NULL) 9988c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 9989c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp#ifdef PNG_WRITE_iCCP_SUPPORTED 9990c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if ((LocaleCompare(name,"ICC") == 0) || 9991c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (LocaleCompare(name,"ICM") == 0)) 999226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 9993c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 9994c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_iCCP == MagickFalse) 9995c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 999616ea139d53d867211d3bb0fa859a83de653f687ecristy png_set_iCCP(ping,ping_info,(png_charp) name,0, 9997e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 9998c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_charp) GetStringInfoDatum(profile), 9999e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#else 10000e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp (png_const_bytep) GetStringInfoDatum(profile), 10001e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#endif 10002c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10003c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 1000426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 100050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10006c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 100073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 10008c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_zCCP == MagickFalse) 10009c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10010cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_png_write_raw_profile(image_info,ping,ping_info, 10011c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (unsigned char *) name,(unsigned char *) name, 10012c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp GetStringInfoDatum(profile), 10013c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10014c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10015c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 100160b206f5daa453dc1035db5890cabc899736dc2d0glennrp 10017c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10018c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10019c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Setting up text chunk with %s profile",name); 100200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10021c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp name=GetNextImageProfile(image); 10022c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 100230d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 100243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_sRGB_SUPPORTED) 100273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_srgb == 0) && 100285f11bf96e873e4051dcb4682ec3b225ff46c36aeglennrp (image->rendering_intent != UndefinedIntent)) 100293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1003026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_sRGB == MagickFalse) 1003126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1003226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1003326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image rendering intent. 1003426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1003526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1003626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1003726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up sRGB chunk"); 100380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1003926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) png_set_sRGB(ping,ping_info,( 10040cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 10041cf002022280cc4dedb2748ad6f415aac1d44f530glennrp image->rendering_intent))); 1004226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 100433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1004426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 100455af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((!mng_info->write_mng) || (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 100463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 100473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100482cc891a179d622dde7bbb8854138851e828bc6eaglennrp if (ping_exclude_gAMA == MagickFalse && 100492cc891a179d622dde7bbb8854138851e828bc6eaglennrp (ping_exclude_sRGB == MagickFalse || 1005026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->gamma < .45 || image->gamma > .46))) 1005126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 100523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_gama == 0) && (image->gamma != 0.0)) 100533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 100553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image gamma. 100563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 100573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 100583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 100593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 100603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up gAMA chunk"); 100613b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 100623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_gAMA(ping,ping_info,image->gamma); 100633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1006426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 100652b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 1006626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_cHRM == MagickFalse) 100673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1006826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if ((mng_info->have_write_global_chrm == 0) && 1006926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->chromaticity.red_primary.x != 0.0)) 1007026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1007126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1007226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image chromaticity. 1007326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 1007426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1007526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PrimaryInfo 1007626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp, 1007726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp, 1007826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp, 1007926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp; 1008026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1008126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp=image->chromaticity.white_point; 1008226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp=image->chromaticity.red_primary; 1008326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp=image->chromaticity.green_primary; 1008426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp=image->chromaticity.blue_primary; 1008526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1008626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1008726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1008826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up cHRM chunk"); 1008926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1009026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_cHRM(ping,ping_info,wp.x,wp.y,rp.x,rp.y,gp.x,gp.y, 1009126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp.x,bp.y); 1009226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1009326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 100943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10095dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 100965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=image_info->interlace != NoInterlace; 100973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 100993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sig_bytes(ping,8); 101003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101015d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy /* Bail out if cannot meet defined png:bit-depth or png:color-type */ 101023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10103d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (mng_info->write_png_colortype != 0) 101043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY) 101068d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (ping_have_color != MagickFalse) 101073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101085af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type = PNG_COLOR_TYPE_RGB; 101092b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 101105af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 101115af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 101123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY_ALPHA) 101158d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (ping_have_color != MagickFalse) 101165af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type = PNG_COLOR_TYPE_RGB_ALPHA; 101173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101190e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (ping_need_colortype_warning != MagickFalse || 101200e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ((mng_info->write_png_depth && 101215af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (int) mng_info->write_png_depth != ping_bit_depth) || 101223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->write_png_colortype && 101235af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ((int) mng_info->write_png_colortype-1 != ping_color_type && 10124991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp mng_info->write_png_colortype != 7 && 101250e8ea19baa0666ccfe869d19116372f60fe9230fglennrp !(mng_info->write_png_colortype == 5 && ping_color_type == 0))))) 101263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 101283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101290e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (ping_need_colortype_warning != MagickFalse) 101300e8ea19baa0666ccfe869d19116372f60fe9230fglennrp { 101310e8ea19baa0666ccfe869d19116372f60fe9230fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101320e8ea19baa0666ccfe869d19116372f60fe9230fglennrp " Image has transparency but tRNS chunk was excluded"); 101330e8ea19baa0666ccfe869d19116372f60fe9230fglennrp } 101340e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 101353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 101363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101385d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:bit-depth=%u, Computed depth=%u", 101393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth, 101405af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth); 101413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101420e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 101433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 101443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101465d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:color-type=%u, Computed color type=%u", 101473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1, 101485af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type); 101493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101510e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 101523bd2e411d0f07c705a40c2c73ce7eda3f1f03e0cglennrp png_warning(ping, 101535d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy "Cannot write image with defined png:bit-depth or png:color-type."); 101543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1015658e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (image_matte != MagickFalse && image->matte == MagickFalse) 101573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Add an opaque matte channel */ 101593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->matte = MagickTrue; 1016016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageAlpha(image,OpaqueAlpha,exception); 101610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10162b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (logging != MagickFalse) 10163b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10164b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Added an opaque matte channel"); 101653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101670e319739731741c52a6303723e0c8678a0df5579glennrp if (number_transparent != 0 || number_semitransparent != 0) 10168e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp { 10169991d11dd9c33e65872778b81aff1347cd2878154glennrp if (ping_color_type < 4) 10170c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10171991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS=MagickTrue; 10172c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10173c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10174c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Setting ping_have_tRNS=MagickTrue."); 10175c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10176e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp } 10177e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp 101783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 101793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG header chunks"); 101813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101825af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_set_IHDR(ping,ping_info,ping_width,ping_height, 101835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth,ping_color_type, 101845af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method,ping_compression_method, 101855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method); 101865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 1018739992b4dd9b12ef752d55b8e402c069698851f72glennrp if (ping_color_type == 3 && ping_have_PLTE != MagickFalse) 1018839992b4dd9b12ef752d55b8e402c069698851f72glennrp { 10189f09bdedccf9ca10bc002a946227df3367cb58d14glennrp png_set_PLTE(ping,ping_info,palette,number_colors); 101900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101913b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 1019239992b4dd9b12ef752d55b8e402c069698851f72glennrp { 101938640fb5e9b1094f35f8beab436f81661b8a99448glennrp for (i=0; i< (ssize_t) number_colors; i++) 101940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 10195d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (i < ping_num_trans) 101960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10197d6bf1617e99df0272b231855a933a74e99b6578fglennrp " PLTE[%d] = (%d,%d,%d), tRNS[%d] = (%d)", 10198d6bf1617e99df0272b231855a933a74e99b6578fglennrp (int) i, 101990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].red, 102000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].green, 102010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].blue, 10202d6bf1617e99df0272b231855a933a74e99b6578fglennrp (int) i, 102030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_alpha[i]); 102040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 102050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10206d6bf1617e99df0272b231855a933a74e99b6578fglennrp " PLTE[%d] = (%d,%d,%d)", 102070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) i, 102080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].red, 102090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].green, 102100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) palette[i].blue); 102110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 1021239992b4dd9b12ef752d55b8e402c069698851f72glennrp } 1021339992b4dd9b12ef752d55b8e402c069698851f72glennrp } 1021439992b4dd9b12ef752d55b8e402c069698851f72glennrp 1021526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 1021626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1021726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_bKGD != MagickFalse) 10218c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 1021926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_bKGD(ping,ping_info,&ping_background); 10220c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging) 10221c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 10222c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10223c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Setting up bKGD chunk"); 10224c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10225c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background color = (%d,%d,%d)", 10226c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.red, 10227c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.green, 10228c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.blue); 10229c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10230c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " index = %d, gray=%d", 10231c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index, 10232c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.gray); 10233c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 10234c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 1023526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10236991d11dd9c33e65872778b81aff1347cd2878154glennrp 1023726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 10238dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1023926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_pHYs != MagickFalse) 1024026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1024126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_pHYs(ping,ping_info, 1024226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_x_resolution, 1024326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_y_resolution, 1024426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_unit_type); 10245823b55c200d7fc1818ab539b036a9c24feaecda8glennrp 10246823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (logging) 10247823b55c200d7fc1818ab539b036a9c24feaecda8glennrp { 10248823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10249823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Setting up pHYs chunk"); 10250823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10251823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " x_resolution=%lu", 10252823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_x_resolution); 10253823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10254823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " y_resolution=%lu", 10255823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_y_resolution); 10256823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10257823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " unit_type=%lu", 10258823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_unit_type); 10259823b55c200d7fc1818ab539b036a9c24feaecda8glennrp } 1026026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10261dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10262dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10263dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#if defined(PNG_oFFs_SUPPORTED) 102644f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_oFFs == MagickFalse) 10265dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1026626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (image->page.x || image->page.y) 1026726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1026826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_oFFs(ping,ping_info,(png_int_32) image->page.x, 1026926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (png_int_32) image->page.y, 0); 10270dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 1027126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1027226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1027326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up oFFs chunk with x=%d, y=%d, units=0", 1027426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (int) image->page.x, (int) image->page.y); 1027526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10276dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10277dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#endif 10278dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10279da8f3a7bfddac2680a3069a490db541e7944edafglennrp if (mng_info->need_blob != MagickFalse) 10280da8f3a7bfddac2680a3069a490db541e7944edafglennrp { 1028116ea139d53d867211d3bb0fa859a83de653f687ecristy if (OpenBlob(image_info,image,WriteBinaryBlobMode,exception) == 10282da8f3a7bfddac2680a3069a490db541e7944edafglennrp MagickFalse) 10283da8f3a7bfddac2680a3069a490db541e7944edafglennrp png_error(ping,"WriteBlob Failed"); 10284da8f3a7bfddac2680a3069a490db541e7944edafglennrp 10285da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickTrue; 10286da8f3a7bfddac2680a3069a490db541e7944edafglennrp } 10287da8f3a7bfddac2680a3069a490db541e7944edafglennrp 102883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info_before_PLTE(ping, ping_info); 10289991d11dd9c33e65872778b81aff1347cd2878154glennrp 1029039992b4dd9b12ef752d55b8e402c069698851f72glennrp if (ping_have_tRNS != MagickFalse && ping_color_type < 4) 10291991d11dd9c33e65872778b81aff1347cd2878154glennrp { 102923b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Calling png_set_tRNS with num_trans=%d",ping_num_trans); 102960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10297991d11dd9c33e65872778b81aff1347cd2878154glennrp 102980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == 3) 102990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 103000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_trans_alpha, 103010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_num_trans, 103020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL); 10303991d11dd9c33e65872778b81aff1347cd2878154glennrp 103040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 103050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 103060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 103070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL, 103080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 0, 103090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp &ping_trans_color); 103100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103113b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 103120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 103130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10314c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " tRNS color =(%d,%d,%d)", 103150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.red, 103160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.green, 103170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.blue); 103180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 103190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 103200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10321991d11dd9c33e65872778b81aff1347cd2878154glennrp 103223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any png-chunk-b profiles */ 10323cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-b",logging); 10324da8f3a7bfddac2680a3069a490db541e7944edafglennrp 103253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info(ping,ping_info); 10326991d11dd9c33e65872778b81aff1347cd2878154glennrp 103273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-m profiles */ 10328cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-m",logging); 103293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1033026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_vpAg == MagickFalse) 103313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 103324f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 103334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (image->page.height != 0 && image->page.height != image->rows)) 1033426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1033526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp unsigned char 1033626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[14]; 1033726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1033826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 1033926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGType(chunk,mng_vpAg); 1034003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 1034126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+4,(png_uint_32) image->page.width); 1034226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+8,(png_uint_32) image->page.height); 1034326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[12]=0; /* unit = pixels */ 1034426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlob(image,13,chunk); 1034526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 1034626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 103473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 103493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (PNG_LIBPNG_VER == 10206) 103509c1eb0729653219b9da9037e044501a6dce79d10glennrp /* avoid libpng-1.2.6 bug by setting PNG_HAVE_IDAT flag */ 103513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_HAVE_IDAT 0x04 103529c1eb0729653219b9da9037e044501a6dce79d10glennrp ping->mode |= PNG_HAVE_IDAT; 103533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef PNG_HAVE_IDAT 103543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 103553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 103563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_packing(ping); 103573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 103583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate memory. 103593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 103603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes=image->columns; 10361b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (image_depth > 8) 10362b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 103637202c101b42be63076be56386f79429bb2f39784cristy switch (ping_color_type) 103643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10365b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGB: 103663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=3; 10367b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 103680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10369b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 10370b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 10371b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 103720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10373b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGBA: 103743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=4; 10375b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 103760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10377b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp default: 10378b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 103793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103803b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 103813b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 103823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10383b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10384b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing PNG image data"); 103850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10386b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10387e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Allocating %.20g bytes of memory for pixels",(double) rowbytes); 103883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10389cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) AcquireQuantumMemory(rowbytes, 10390cf002022280cc4dedb2748ad6f415aac1d44f530glennrp sizeof(*ping_pixels)); 103910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10392cf002022280cc4dedb2748ad6f415aac1d44f530glennrp if (ping_pixels == (unsigned char *) NULL) 10393edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Allocation of memory for pixels failed"); 103940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 103963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image scanlines. 103973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10398ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy quantum_info=AcquireQuantumInfo(image_info,image); 10399ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy if (quantum_info == (QuantumInfo *) NULL) 10400edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation for quantum_info failed"); 104013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->format=UndefinedQuantumFormat; 104023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=image_depth; 104033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 104048bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 104053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!mng_info->write_png8 && !mng_info->write_png24 && 104068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp !mng_info->write_png32) && 104078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (mng_info->IsPalette || 104083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->type == BilevelType)) && 104098d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp image_matte == MagickFalse && 104108d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw == MagickFalse) 104113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104128bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp /* Palette, Bilevel, or Opaque Monochrome */ 1041316ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 104143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 104150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 104173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 104183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 104203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a PNG monochrome image. 104213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10422bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 104233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10424d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse && y == 0) 104253b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 104263b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Writing row of pixels (0)"); 10427a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 1042816ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 104290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1043016ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 104313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 104320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 104343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1043516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1043616ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 104373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE && 104383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth && 104393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth != old_bit_depth) 104403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Undo pixel scaling */ 10442bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10443cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) (*(ping_pixels+i) 104443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy >> (8-old_bit_depth)); 104453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 104493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1045016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1045116ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 104523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE) 10455bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10456cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) ((*(ping_pixels+i) > 127) ? 104573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 255 : 0); 104580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104593b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10460b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10461b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (1)"); 104620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10463cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 104643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->previous == (Image *) NULL) 104663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 104683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 104693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 104703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 104730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104748bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* Not Palette, Bilevel, or Opaque Monochrome */ 104753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((!mng_info->write_png8 && !mng_info->write_png24 && 104773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !mng_info->write_png32) && 1047858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp (image_matte != MagickFalse || 104795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_bit_depth >= MAGICKCORE_QUANTUM_DEPTH)) && 104808d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp (mng_info->IsPalette) && ping_have_color == MagickFalse) 104813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1048216ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 104838bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 104840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104858bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 104863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104878bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 10488bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 104893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1049016ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 104912cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1049216ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 104933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 104942cc891a179d622dde7bbb8854138851e828bc6eaglennrp 104955af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 104963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 104978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->IsPalette) 1049816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1049916ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 105002cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 1050216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1050316ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 105042cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105058bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 105068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 105078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY PNG pixels (2)"); 105083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 105092cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105108bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* PNG_COLOR_TYPE_GRAY_ALPHA */ 10511b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 105123b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10513b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 105148bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (2)"); 105152cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1051616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1051716ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayAlphaQuantum,ping_pixels,exception); 10518b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 105192cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105203b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10521b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 105228bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (2)"); 105232cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10524cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 105253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 105262cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105278bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (image->previous == (Image *) NULL) 105288bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 105298bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp status=SetImageProgress(image,LoadImageTag,pass,num_passes); 105308bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (status == MagickFalse) 105318bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 105328bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105338bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105348bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 105363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 105373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1053816ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 105398bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 105400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 105418bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 105423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 105438bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if ((image_depth > 8) || (mng_info->write_png24 || 105448bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp mng_info->write_png32 || 105458bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (!mng_info->write_png8 && !mng_info->IsPalette))) 105468bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 105478bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 10548b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 10549862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 105502cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1055116ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 105528bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 105532cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105548bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 105558bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 105568bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (image->storage_class == DirectClass) 1055716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1055816ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 105592cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105608bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1056116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1056216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 105638bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105642cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105658bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 105668bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1056716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 10568cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1056916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 105702cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105718bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 105728bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 105738bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (3)"); 105748bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105752cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105768bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (image_matte != MagickFalse) 1057716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1057816ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBAQuantum,ping_pixels,exception); 105792cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105808bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1058116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1058216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBQuantum,ping_pixels,exception); 105832cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105843b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10585b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 105868bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (3)"); 105872cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10588cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 10589b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 105908bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 105912cc891a179d622dde7bbb8854138851e828bc6eaglennrp 105928bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 105938bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp /* not ((image_depth > 8) || (mng_info->write_png24 || 105948bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp mng_info->write_png32 || 105958bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (!mng_info->write_png8 && !mng_info->IsPalette))) */ 105968bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 105978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if ((ping_color_type != PNG_COLOR_TYPE_GRAY) && 105988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (ping_color_type != PNG_COLOR_TYPE_GRAY_ALPHA)) 105998bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 106008bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse) 106018bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106028bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is not GRAY or GRAY_ALPHA",pass); 106032cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106048bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp quantum_info->depth=8; 106058bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=8; 106068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 106072cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106088bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 106098640fb5e9b1094f35f8beab436f81661b8a99448glennrp { 106108bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 106118bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106128bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); 106132cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1061416ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 106152cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1061616ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 106178bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 106182cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 1062044757ab033a4bc1f272fb26c9a46325ca01a5482glennrp { 106214bf89731a90c6e03598950223e19e7be7b95d630glennrp quantum_info->depth=image->depth; 106224bf89731a90c6e03598950223e19e7be7b95d630glennrp 1062316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1062416ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 1062544757ab033a4bc1f272fb26c9a46325ca01a5482glennrp } 106262cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106278bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 106288bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 106298bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 106308bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106318bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (4)"); 106322cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1063316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 10634cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1063516ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 106368bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 106372cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106388bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 106398bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1064016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1064116ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,IndexQuantum,ping_pixels,exception); 106422cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106435eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp if (logging != MagickFalse && y <= 2) 106445eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp { 106455eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106461a7d6dbd296698a7cddbc625896987bf674c0cc4glennrp " Writing row of non-gray pixels (4)"); 106475eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp 106485eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106495eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp " ping_pixels[0]=%d,ping_pixels[1]=%d", 106505eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (int)ping_pixels[0],(int)ping_pixels[1]); 106515eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp } 106528bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 10653cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 106548bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 106558bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 106562cc891a179d622dde7bbb8854138851e828bc6eaglennrp 106578bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (image->previous == (Image *) NULL) 106588bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 106598bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp status=SetImageProgress(image,LoadImageTag,pass,num_passes); 106608bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (status == MagickFalse) 106618bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 106628640fb5e9b1094f35f8beab436f81661b8a99448glennrp } 106633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 106643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 106658bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 106668bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 10667b32b90a7e1ee2275333589072c496b5f69e17feccristy if (quantum_info != (QuantumInfo *) NULL) 10668b32b90a7e1ee2275333589072c496b5f69e17feccristy quantum_info=DestroyQuantumInfo(quantum_info); 106693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 106703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 106713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10673b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Wrote PNG image data"); 106740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10676e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Width: %.20g",(double) ping_width); 106770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10679e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Height: %.20g",(double) ping_height); 106800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 106823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106845d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:bit-depth: %d",mng_info->write_png_depth); 106853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 106860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG bit-depth written: %d",ping_bit_depth); 106890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 106913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106935d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:color-type: %d",mng_info->write_png_colortype-1); 106943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 106950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106975af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG color-type written: %d",ping_color_type); 106980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 106993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 107005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG Interlace method: %d",ping_interlace_method); 107013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 107023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 10703a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp Generate text chunks after IDAT. 107043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10705823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse) 107063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1070726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ResetImagePropertyIterator(image); 1070826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1070926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp while (property != (const char *) NULL) 1071026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1071126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_textp 1071226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp text; 107132cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1071416ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(image,property,exception); 10715a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 10716a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Don't write any "png:" properties; those are just for "identify" */ 10717a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (LocaleNCompare(property,"png:",4) != 0 && 10718a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 10719a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress density and units if we wrote a pHYs chunk */ 10720a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_pHYs != MagickFalse || 10721823b55c200d7fc1818ab539b036a9c24feaecda8glennrp LocaleCompare(property,"density") != 0 || 10722a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleCompare(property,"units") != 0) && 10723a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 10724a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress the IM-generated Date:create and Date:modify */ 10725a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_date == MagickFalse || 10726a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleNCompare(property, "Date:",5) != 0)) 1072726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 10728c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (value != (const char *) NULL) 10729c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 10730c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text=(png_textp) png_malloc(ping,(png_uint_32) sizeof(png_text)); 10731c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].key=(char *) property; 10732c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text=(char *) value; 10733c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length=strlen(value); 107342cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10735c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (ping_exclude_tEXt != MagickFalse) 10736c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_zTXt; 107372cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10738c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else if (ping_exclude_zTXt != MagickFalse) 10739c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_NONE; 107402cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10741c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else 1074226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 10743c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=image_info->compression == NoCompression || 10744c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (image_info->compression == UndefinedCompression && 10745c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length < 128) ? PNG_TEXT_COMPRESSION_NONE : 10746c70af4ac292f8db9a1ab488318912894d412cb8cglennrp PNG_TEXT_COMPRESSION_zTXt ; 1074726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 107482cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10749c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (logging != MagickFalse) 10750c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 10751c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10752c70af4ac292f8db9a1ab488318912894d412cb8cglennrp " Setting up text chunk"); 10753c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 10754c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10755c70af4ac292f8db9a1ab488318912894d412cb8cglennrp " keyword: %s",text[0].key); 10756c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 10757c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 10758c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_set_text(ping,ping_info,text,1); 10759c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_free(ping,text); 10760c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 1076126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1076226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1076326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 107643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 107653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 107663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-e profiles */ 10767cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-e",logging); 107683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 107693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 107703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 107713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG end info"); 107720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 107733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_end(ping,ping_info); 107740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 107753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && (int) image->dispose == BackgroundDispose) 107763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 107773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.x || mng_info->page.y || 107785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_width != mng_info->page.width) || 107795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_height != mng_info->page.height)) 107803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 107813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 107823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[32]; 107833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 107843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 107853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write FRAM 4 with clipping boundaries followed by FRAM 1. 107863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 107873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,27L); /* data length=27 */ 107883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1078903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,27L); 107903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=4; 107913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 107923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=1; /* flag for changing delay, for next frame only */ 107933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 107943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=1; /* flag for changing frame clipping for next frame */ 107953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 107963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) (0L)); /* temporary 0 delay */ 107973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=0; /* clipping boundaries delta type */ 107983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */ 107993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+19, 108005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.x + ping_width)); 108013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */ 108023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+27, 108035af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.y + ping_height)); 108043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,31,chunk); 108053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,31)); 108063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=4; 108073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 108083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 108103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 108113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 108123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng && !mng_info->need_fram && 108143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((int) image->dispose == 3)) 10815edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cannot convert GIF with disposal method 3 to MNG-LC"); 108160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 108173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free PNG resources. 108193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 108205af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 108213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 108223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10823cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_pixels=(unsigned char *) RelinquishMagickMemory(ping_pixels); 108243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1082516ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 1082616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 1082716ea139d53d867211d3bb0fa859a83de653f687ecristy 1082816ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 1082916ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 1083016ea139d53d867211d3bb0fa859a83de653f687ecristy 10831b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp /* Store bit depth actually written */ 10832b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[0]=(char) ping_bit_depth; 10833b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[1]='\0'; 10834b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 1083516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(IMimage,"png:bit-depth-written",s,exception); 10836b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 108373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 108383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 108393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOnePNGImage()"); 108400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10841edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#ifdef PNG_SETJMP_NOT_THREAD_SAFE 10842edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 10843edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 10844edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 10845edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block. Revert to 10846edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 10847edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 10848edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 108493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 108503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* End write one PNG image */ 10851edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 108523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 108533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 108543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 108553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 108563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e P N G I m a g e % 108603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 108633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 108643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WritePNGImage() writes a Portable Network Graphics (PNG) or 108663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file. 108673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 108693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WritePNGImage method is: 108713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1087216ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1087316ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 108743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 108763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 108783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 108803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1088116ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1088216ea139d53d867211d3bb0fa859a83de653f687ecristy% 108833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Returns MagickTrue on success, MagickFalse on failure. 108843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Communicating with the PNG encoder: 108863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% While the datastream written is always in PNG format and normally would 108883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be given the "png" file extension, this method also writes the following 108895d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% pseudo-formats which are subsets of png: 108903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 108915a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% o PNG8: An 8-bit indexed PNG datastream is written. If the image has 108925a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% a depth greater than 8, the depth is reduced. If transparency 108933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is present, the tRNS chunk must only have values 0 and 255 108943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (i.e., transparency is binary: fully opaque or fully 108955a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent). If other values are present they will be 108965a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 50%-thresholded to binary transparency. If more than 256 10897e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% colors are present, they will be quantized to the 4-4-4-1, 10898130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% 3-3-3-1, or 3-3-2-1 palette. The underlying RGB color 10899130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% of any resulting fully-transparent pixels is changed to 10900130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% the image's background color. 10901e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% 10902e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% If you want better quantization or dithering of the colors 10903e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% or alpha than that, you need to do it before calling the 109045a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG encoder. The pixels contain 8-bit indices even if 109055a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% they could be represented with 1, 2, or 4 bits. Grayscale 109063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% images will be written as indexed PNG files even though the 109075a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG grayscale type might be slightly more efficient. Please 109085a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% note that writing to the PNG8 format may result in loss 109095a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% of color and alpha data. 109103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG24: An 8-bit per sample RGB PNG datastream is written. The tRNS 109123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk can be present to convey binary transparency by naming 109135a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% one of the colors as transparent. The only loss incurred 109145a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% is reduction of sample depth to 8. If the image has more 109155a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% than one transparent color, has semitransparent pixels, or 109165a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% has an opaque pixel with the same RGB components as the 109175a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent color, an image is not written. 109183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG32: An 8-bit per sample RGBA PNG is written. Partial 109203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparency is permitted, i.e., the alpha sample for 109213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% each pixel can have any value from 0 to 255. The alpha 109220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% channel is present even if the image is fully opaque. 109235a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% The only loss in data is the reduction of the sample depth 109245a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% to 8. 109253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o -define: For more precise control of the PNG output, you can use the 109273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image options "png:bit-depth" and "png:color-type". These 109283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% can be set from the commandline with "-define" and also 10929bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% from the application programming interfaces. The options 10930bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% are case-independent and are converted to lowercase before 10931bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% being passed to this encoder. 109323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:color-type can be 0, 2, 3, 4, or 6. 109343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 0 (Grayscale), png:bit-depth can 109363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, 8, or 16. 109373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 2 (RGB), png:bit-depth can 109393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 8 or 16. 109403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 3 (Indexed), png:bit-depth can 109423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, or 8. This refers to the number of bits 109433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% used to store the index. The color samples always have 109443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% bit-depth 8 in indexed PNG files. 109453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 4 (Gray-Matte) or 6 (RGB-Matte), 109473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:bit-depth can be 8 or 16. 109483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109495a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% If the image cannot be written without loss with the requested bit-depth 109505a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% and color-type, a PNG file will not be written, and the encoder will 109515a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% return MagickFalse. 109525a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 109533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Since image encoders should not be responsible for the "heavy lifting", 109543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the user should make sure that ImageMagick has already reduced the 109553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image depth and number of colors and limit transparency to binary 109565a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparency prior to attempting to write the image with depth, color, 1095716ea139d53d867211d3bb0fa859a83de653f687ecristy% or transparency limitations. 109583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Note that another definition, "png:bit-depth-written" exists, but it 109603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is not intended for external use. It is only used internally by the 109613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG encoder to inform the JNG encoder of the depth of the alpha channel. 109623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It is possible to request that the PNG encoder write previously-formatted 109643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary chunks in the output PNG file, using the "-profile" commandline 109653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% option as shown below or by setting the profile via a programming 109663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% interface: 109673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% -profile PNG-chunk-x:<file> 109693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% where x is a location flag and <file> is a file containing the chunk 109713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% name in the first 4 bytes, then a colon (":"), followed by the chunk data. 10972bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% This encoder will compute the chunk length and CRC, so those must not 10973bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% be included in the file. 109743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "x" can be "b" (before PLTE), "m" (middle, i.e., between PLTE and IDAT), 109763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% or "e" (end, i.e., after IDAT). If you want to write multiple chunks 109773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of the same type, then add a short unique string after the "x" to prevent 10978bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% subsequent profiles from overwriting the preceding ones, e.g., 109793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10980bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% -profile PNG-chunk-b01:file01 -profile PNG-chunk-b02:file02 109813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 109823241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp% As of version 6.6.6 the following optimizations are always done: 109830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 10984d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o 32-bit depth is reduced to 16. 109850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o 16-bit depth is reduced to 8 if all pixels contain samples whose 109860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% high byte and low byte are identical. 109870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Palette is sorted to remove unused entries and to put a 10988cf002022280cc4dedb2748ad6f415aac1d44f530glennrp% transparent color first, if BUILD_PNG_PALETTE is defined. 109890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Opaque matte channel is removed when writing an indexed PNG. 10990d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Grayscale images are reduced to 1, 2, or 4 bit depth if 10991d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% this can be done without loss and a larger bit depth N was not 109925d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% requested via the "-define png:bit-depth=N" option. 10993d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o If matte channel is present but only one transparent color is 10994d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% present, RGB+tRNS is written instead of RGBA 10995d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Opaque matte channel is removed (or added, if color-type 4 or 6 10996d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% was requested when converting an opaque image). 109970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 109983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 109993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 110003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1100116ea139d53d867211d3bb0fa859a83de653f687ecristy Image *image,ExceptionInfo *exception) 110023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 110033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1100421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp excluding, 1100521f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 1100621f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 110073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 110083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 110103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 110113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 110133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 110143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 1101621f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp i, 110175c7cf4e469a4dad7e277783749155932252c52dfglennrp source; 110185c7cf4e469a4dad7e277783749155932252c52dfglennrp 110193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 110203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 110213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 110223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 110233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 110243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 110253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 110263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 11027fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WritePNGImage()"); 110283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 110293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 110303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 110313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1103273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 110330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 110353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 110360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 110383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 110393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 110403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 110413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 11042a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mng_info->equal_backgrounds=MagickTrue; 110433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 110443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* See if user has requested a specific PNG subformat */ 110463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 110483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 110493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 110503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11051b381a2618e8bb9e1e76299676711d0ec1063feabglennrp value=GetImageOption(image_info,"png:format"); 11052b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11053b381a2618e8bb9e1e76299676711d0ec1063feabglennrp if (value != (char *) NULL) 11054b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11055b381a2618e8bb9e1e76299676711d0ec1063feabglennrp if (LocaleCompare(value,"png8") == 0) 11056b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11057b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png8 = MagickTrue; 11058b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png24 = MagickFalse; 11059b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png32 = MagickFalse; 11060b381a2618e8bb9e1e76299676711d0ec1063feabglennrp } 11061b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11062b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png24") == 0) 11063b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11064b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png8 = MagickFalse; 11065b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png24 = MagickTrue; 11066b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png32 = MagickFalse; 11067b381a2618e8bb9e1e76299676711d0ec1063feabglennrp } 11068b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11069b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png32") == 0) 11070b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11071b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png8 = MagickFalse; 11072b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png24 = MagickFalse; 11073b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png32 = MagickTrue; 11074b381a2618e8bb9e1e76299676711d0ec1063feabglennrp } 11075b381a2618e8bb9e1e76299676711d0ec1063feabglennrp } 110763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8) 110773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 110789c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 3 */ 4; 110799c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 110809c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 110813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 110823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png24) 110843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 110859c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 2 */ 3; 110869c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 110879c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 110880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110899c1eb0729653219b9da9037e044501a6dce79d10glennrp if (image->matte == MagickTrue) 1109016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorMatteType,exception); 110910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110929c1eb0729653219b9da9037e044501a6dce79d10glennrp else 1109316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorType,exception); 110940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1109516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 110963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 110973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 110983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png32) 110993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111009c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 6 */ 7; 111019c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 111029c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 111030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111049c1eb0729653219b9da9037e044501a6dce79d10glennrp if (image->matte == MagickTrue) 1110516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorMatteType,exception); 111060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111079c1eb0729653219b9da9037e044501a6dce79d10glennrp else 1110816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorType,exception); 111090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1111016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 111113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 111133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageOption(image_info,"png:bit-depth"); 111148bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 111153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 111163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"1") == 0) 111189c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 1; 111190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 111219c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 2; 111220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 111249c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 4; 111250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"8") == 0) 111279c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 111280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"16") == 0) 111309c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 16; 111310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11132bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1113316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11134bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11135bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:bit-depth", 11136bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11137bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 111383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 111399c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11140bb8a733a352d1143bf6e823471ccce72aee8189fglennrp " png:bit-depth=%d was defined.\n",mng_info->write_png_depth); 111413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy value=GetImageOption(image_info,"png:color-type"); 111440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 111463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We must store colortype+1 because 0 is a valid colortype */ 111483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"0") == 0) 111499c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 1; 111500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1115116ea139d53d867211d3bb0fa859a83de653f687ecristy else if (LocaleCompare(value,"1") == 0) 1115216ea139d53d867211d3bb0fa859a83de653f687ecristy mng_info->write_png_colortype = 2; 1115316ea139d53d867211d3bb0fa859a83de653f687ecristy 111543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 111559c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 3; 111560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"3") == 0) 111589c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 4; 111590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 111619c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 5; 111620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"6") == 0) 111649c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 7; 111650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11166bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1116716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11168bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11169bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:color-type", 11170bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11171bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 111723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 111739c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11174d6bf1617e99df0272b231855a933a74e99b6578fglennrp " png:color-type=%d was defined.\n",mng_info->write_png_colortype-1); 111753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 111770e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* Check for chunks to be excluded: 111780e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 111790dff56c31fb2f5daa9744018ca533e387c246afcglennrp * The default is to not exclude any known chunks except for any 111800e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * listed in the "unused_chunks" array, above. 111810e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 111825d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * Chunks can be listed for exclusion via a "png:exclude-chunk" 111830e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * define (in the image properties or in the image artifacts) 111840e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or via a mng_info member. For convenience, in addition 111850e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * to or instead of a comma-separated list of chunks, the 111860e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string can be simply "all" or "none". 111870e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 111880e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The exclude-chunk define takes priority over the mng_info. 111890e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 111905d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * A "png:include-chunk" define takes priority over both the 111915d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * mng_info and the "png:exclude-chunk" define. Like the 111920e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string, it can define "all" or "none" as 111930dff56c31fb2f5daa9744018ca533e387c246afcglennrp * well as a comma-separated list. Chunks that are unknown to 111940dff56c31fb2f5daa9744018ca533e387c246afcglennrp * ImageMagick are always excluded, regardless of their "copy-safe" 111950dff56c31fb2f5daa9744018ca533e387c246afcglennrp * status according to the PNG specification, and even if they 11196aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * appear in the "include-chunk" list. Such defines appearing among 11197aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * the image options take priority over those found among the image 11198aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * artifacts. 111990e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 112000e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * Finally, all chunks listed in the "unused_chunks" array are 112010e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * automatically excluded, regardless of the other instructions 112020e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or lack thereof. 112030e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 112040e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * if you exclude sRGB but not gAMA (recommended), then sRGB chunk 112050e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * will not be written and the gAMA chunk will only be written if it 112060e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is not between .45 and .46, or approximately (1.0/2.2). 112070e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 112080e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * If you exclude tRNS and the image has transparency, the colortype 112090e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is forced to be 4 or 6 (GRAY_ALPHA or RGB_ALPHA). 112100e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 112110e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The -strip option causes StripImage() to set the png:include-chunk 11212104f206c40efbb0a0eeba846672009345423e969glennrp * artifact to "none,trns,gama". 112130e8ea19baa0666ccfe869d19116372f60fe9230fglennrp */ 112140e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 1121526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_bKGD=MagickFalse; 1121626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_cHRM=MagickFalse; 11217a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 1121826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_EXIF=MagickFalse; /* hex-encoded EXIF in zTXt */ 1121926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_gAMA=MagickFalse; 1122026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_iCCP=MagickFalse; 1122126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* mng_info->ping_exclude_iTXt=MagickFalse; */ 1122226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_oFFs=MagickFalse; 1122326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_pHYs=MagickFalse; 1122426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_sRGB=MagickFalse; 1122526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_tEXt=MagickFalse; 11226a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 1122726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_vpAg=MagickFalse; 1122826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zCCP=MagickFalse; /* hex-encoded iCCP in zTXt */ 1122926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zTXt=MagickFalse; 1123026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 112318d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickFalse; 112328d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 112338d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp value=GetImageArtifact(image,"png:preserve-colormap"); 112348d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value == NULL) 112358d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp value=GetImageOption(image_info,"png:preserve-colormap"); 112368d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value != NULL) 112378d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickTrue; 112388d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 112391868258559ddf946fa73ef72dd43507b32623705glennrp /* Thes compression-level, compression-strategy, and compression-filter 112401868258559ddf946fa73ef72dd43507b32623705glennrp * defines take precedence over values from the -quality option. 112411868258559ddf946fa73ef72dd43507b32623705glennrp */ 112421868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageArtifact(image,"png:compression-level"); 112431868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 112441868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageOption(image_info,"png:compression-level"); 112451868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 112461868258559ddf946fa73ef72dd43507b32623705glennrp { 112471868258559ddf946fa73ef72dd43507b32623705glennrp /* We have to add 1 to everything because 0 is a valid input, 112481868258559ddf946fa73ef72dd43507b32623705glennrp * and we want to use 0 (the default) to mean undefined. 112491868258559ddf946fa73ef72dd43507b32623705glennrp */ 112501868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 112511868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 1; 112521868258559ddf946fa73ef72dd43507b32623705glennrp 112530ffb95c048e16be4f2a8d6aaa76de1dfd7775124glennrp else if (LocaleCompare(value,"1") == 0) 112541868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 2; 112551868258559ddf946fa73ef72dd43507b32623705glennrp 112561868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 112571868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 3; 112581868258559ddf946fa73ef72dd43507b32623705glennrp 112591868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 112601868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 4; 112611868258559ddf946fa73ef72dd43507b32623705glennrp 112621868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 112631868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 5; 112641868258559ddf946fa73ef72dd43507b32623705glennrp 112651868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 112661868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 6; 112671868258559ddf946fa73ef72dd43507b32623705glennrp 112681868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"6") == 0) 112691868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 7; 112701868258559ddf946fa73ef72dd43507b32623705glennrp 112711868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"7") == 0) 112721868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 8; 112731868258559ddf946fa73ef72dd43507b32623705glennrp 112741868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"8") == 0) 112751868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 9; 112761868258559ddf946fa73ef72dd43507b32623705glennrp 112771868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"9") == 0) 112781868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 10; 112791868258559ddf946fa73ef72dd43507b32623705glennrp 112801868258559ddf946fa73ef72dd43507b32623705glennrp else 1128116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 112821868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 112831868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-level", 112841868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 112851868258559ddf946fa73ef72dd43507b32623705glennrp } 112861868258559ddf946fa73ef72dd43507b32623705glennrp 112871868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageArtifact(image,"png:compression-strategy"); 112881868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 112891868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageOption(image_info,"png:compression-strategy"); 112901868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 112911868258559ddf946fa73ef72dd43507b32623705glennrp { 112921868258559ddf946fa73ef72dd43507b32623705glennrp 112931868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 112941868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 112951868258559ddf946fa73ef72dd43507b32623705glennrp 112961868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"1") == 0) 112971868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FILTERED+1; 112981868258559ddf946fa73ef72dd43507b32623705glennrp 112991868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 113001868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 113011868258559ddf946fa73ef72dd43507b32623705glennrp 113021868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 1130398c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ 113041868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_RLE+1; 1130598c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1130698c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1130798c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 113081868258559ddf946fa73ef72dd43507b32623705glennrp 113091868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 1131098c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_FIXED /* Z_FIXED was added to zlib-1.2.2.2 */ 113111868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FIXED+1; 1131298c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1131398c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1131498c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 113151868258559ddf946fa73ef72dd43507b32623705glennrp 113161868258559ddf946fa73ef72dd43507b32623705glennrp else 1131716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 113181868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 113191868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-strategy", 113201868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 113211868258559ddf946fa73ef72dd43507b32623705glennrp } 113221868258559ddf946fa73ef72dd43507b32623705glennrp 113231868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageArtifact(image,"png:compression-filter"); 113241868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 113251868258559ddf946fa73ef72dd43507b32623705glennrp value=GetImageOption(image_info,"png:compression-filter"); 113261868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 113271868258559ddf946fa73ef72dd43507b32623705glennrp { 113281868258559ddf946fa73ef72dd43507b32623705glennrp 113291868258559ddf946fa73ef72dd43507b32623705glennrp /* To do: combinations of filters allowed by libpng 113301868258559ddf946fa73ef72dd43507b32623705glennrp * masks 0x08 through 0xf8 113311868258559ddf946fa73ef72dd43507b32623705glennrp * 113321868258559ddf946fa73ef72dd43507b32623705glennrp * Implement this as a comma-separated list of 0,1,2,3,4,5 113331868258559ddf946fa73ef72dd43507b32623705glennrp * where 5 is a special case meaning PNG_ALL_FILTERS. 113341868258559ddf946fa73ef72dd43507b32623705glennrp */ 113351868258559ddf946fa73ef72dd43507b32623705glennrp 113361868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 113371868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 1; 113381868258559ddf946fa73ef72dd43507b32623705glennrp 113391868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"1") == 0) 113401868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 2; 113411868258559ddf946fa73ef72dd43507b32623705glennrp 113421868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 113431868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 3; 113441868258559ddf946fa73ef72dd43507b32623705glennrp 113451868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 113461868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 4; 113471868258559ddf946fa73ef72dd43507b32623705glennrp 113481868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 113491868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 5; 113501868258559ddf946fa73ef72dd43507b32623705glennrp 113511868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 113521868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 6; 113531868258559ddf946fa73ef72dd43507b32623705glennrp 113541868258559ddf946fa73ef72dd43507b32623705glennrp else 1135516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 113561868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 113571868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-filter", 113581868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 113591868258559ddf946fa73ef72dd43507b32623705glennrp } 113601868258559ddf946fa73ef72dd43507b32623705glennrp 1136103812ae402fb53d548f0e1d7d14720768f803c2dglennrp excluding=MagickFalse; 1136203812ae402fb53d548f0e1d7d14720768f803c2dglennrp 113635c7cf4e469a4dad7e277783749155932252c52dfglennrp for (source=0; source<1; source++) 113645c7cf4e469a4dad7e277783749155932252c52dfglennrp { 113655c7cf4e469a4dad7e277783749155932252c52dfglennrp if (source==0) 11366acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp { 113675c7cf4e469a4dad7e277783749155932252c52dfglennrp value=GetImageArtifact(image,"png:exclude-chunk"); 11368acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 11369acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp if (value == NULL) 11370acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp value=GetImageArtifact(image,"png:exclude-chunks"); 11371acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp } 113725c7cf4e469a4dad7e277783749155932252c52dfglennrp else 11373acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp { 113745c7cf4e469a4dad7e277783749155932252c52dfglennrp value=GetImageOption(image_info,"png:exclude-chunk"); 1137526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 11376acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp if (value == NULL) 11377acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp value=GetImageOption(image_info,"png:exclude-chunks"); 11378acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp } 11379acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 1138003812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (value != NULL) 1138103812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1138226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1138303812ae402fb53d548f0e1d7d14720768f803c2dglennrp size_t 1138403812ae402fb53d548f0e1d7d14720768f803c2dglennrp last; 1138526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1138603812ae402fb53d548f0e1d7d14720768f803c2dglennrp excluding=MagickTrue; 1138726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1138803812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (logging != MagickFalse) 113892cc891a179d622dde7bbb8854138851e828bc6eaglennrp { 113902cc891a179d622dde7bbb8854138851e828bc6eaglennrp if (source == 0) 113912cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 113922cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:exclude-chunk=%s found in image artifacts.\n", value); 113932cc891a179d622dde7bbb8854138851e828bc6eaglennrp else 113942cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 113952cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:exclude-chunk=%s found in image properties.\n", value); 113962cc891a179d622dde7bbb8854138851e828bc6eaglennrp } 1139703812ae402fb53d548f0e1d7d14720768f803c2dglennrp 1139803812ae402fb53d548f0e1d7d14720768f803c2dglennrp last=strlen(value); 1139903812ae402fb53d548f0e1d7d14720768f803c2dglennrp 1140003812ae402fb53d548f0e1d7d14720768f803c2dglennrp for (i=0; i<(int) last; i+=5) 1140103812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1140203812ae402fb53d548f0e1d7d14720768f803c2dglennrp 1140303812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"all",3) == 0) 1140403812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1140503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickTrue; 1140603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickTrue; 11407a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 1140803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickTrue; 1140903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickTrue; 1141003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickTrue; 1141103812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* mng_info->ping_exclude_iTXt=MagickTrue; */ 1141203812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickTrue; 1141303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickTrue; 1141403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_sRGB=MagickTrue; 1141503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickTrue; 11416a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 1141703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickTrue; 1141803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickTrue; 1141903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickTrue; 1142003812ae402fb53d548f0e1d7d14720768f803c2dglennrp i--; 1142103812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 114222cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1142303812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"none",4) == 0) 1142403812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1142503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickFalse; 1142603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickFalse; 11427a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 1142803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickFalse; 1142903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickFalse; 1143003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickFalse; 1143103812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* mng_info->ping_exclude_iTXt=MagickFalse; */ 1143203812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickFalse; 1143303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickFalse; 1143403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_sRGB=MagickFalse; 1143503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickFalse; 11436a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 1143703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickFalse; 1143803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickFalse; 1143903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickFalse; 1144003812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 114412cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1144203812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"bkgd",4) == 0) 1144303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickTrue; 114442cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1144503812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"chrm",4) == 0) 1144603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickTrue; 114472cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11448a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (LocaleNCompare(value+i,"date",4) == 0) 11449a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 11450a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 1145103812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"exif",4) == 0) 1145203812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickTrue; 114532cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1145403812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"gama",4) == 0) 1145503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickTrue; 114562cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1145703812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"iccp",4) == 0) 1145803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickTrue; 114592cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1146003812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* 1146103812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"itxt",4) == 0) 1146203812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iTXt=MagickTrue; 1146303812ae402fb53d548f0e1d7d14720768f803c2dglennrp */ 114642cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1146503812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"gama",4) == 0) 1146603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickTrue; 114672cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1146803812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"offs",4) == 0) 1146903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickTrue; 114702cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1147103812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"phys",4) == 0) 1147203812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickTrue; 114732cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11474a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (LocaleNCompare(value+i,"srgb",4) == 0) 11475a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_sRGB=MagickTrue; 114762cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1147703812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"text",4) == 0) 1147803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickTrue; 114792cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11480a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (LocaleNCompare(value+i,"trns",4) == 0) 11481a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 11482a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp 1148303812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"vpag",4) == 0) 1148403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickTrue; 114852cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1148603812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"zccp",4) == 0) 1148703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickTrue; 114882cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1148903812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"ztxt",4) == 0) 1149003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickTrue; 114912cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1149203812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 11493ce91ed5de546373b90d60e2efd118e76692dc416glennrp } 1149426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1149526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 114965c7cf4e469a4dad7e277783749155932252c52dfglennrp for (source=0; source<1; source++) 114975c7cf4e469a4dad7e277783749155932252c52dfglennrp { 114985c7cf4e469a4dad7e277783749155932252c52dfglennrp if (source==0) 11499acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp { 115005c7cf4e469a4dad7e277783749155932252c52dfglennrp value=GetImageArtifact(image,"png:include-chunk"); 11501acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 11502acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp if (value == NULL) 11503acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp value=GetImageArtifact(image,"png:include-chunks"); 11504acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp } 115055c7cf4e469a4dad7e277783749155932252c52dfglennrp else 11506acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp { 115075c7cf4e469a4dad7e277783749155932252c52dfglennrp value=GetImageOption(image_info,"png:include-chunk"); 1150826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 11509acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp if (value == NULL) 11510acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp value=GetImageOption(image_info,"png:include-chunks"); 11511acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp } 11512acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 1151303812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (value != NULL) 1151403812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1151503812ae402fb53d548f0e1d7d14720768f803c2dglennrp size_t 1151603812ae402fb53d548f0e1d7d14720768f803c2dglennrp last; 1151726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1151803812ae402fb53d548f0e1d7d14720768f803c2dglennrp excluding=MagickTrue; 1151926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1152003812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (logging != MagickFalse) 115212cc891a179d622dde7bbb8854138851e828bc6eaglennrp { 115222cc891a179d622dde7bbb8854138851e828bc6eaglennrp if (source == 0) 115232cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 115242cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:include-chunk=%s found in image artifacts.\n", value); 115252cc891a179d622dde7bbb8854138851e828bc6eaglennrp else 115262cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 115272cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:include-chunk=%s found in image properties.\n", value); 115282cc891a179d622dde7bbb8854138851e828bc6eaglennrp } 1152903812ae402fb53d548f0e1d7d14720768f803c2dglennrp 1153003812ae402fb53d548f0e1d7d14720768f803c2dglennrp last=strlen(value); 1153103812ae402fb53d548f0e1d7d14720768f803c2dglennrp 1153203812ae402fb53d548f0e1d7d14720768f803c2dglennrp for (i=0; i<(int) last; i+=5) 1153303812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1153403812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"all",3) == 0) 1153503812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1153603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickFalse; 1153703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickFalse; 11538a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 1153903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickFalse; 1154003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickFalse; 1154103812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickFalse; 1154203812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* mng_info->ping_exclude_iTXt=MagickFalse; */ 1154303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickFalse; 1154403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickFalse; 1154503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_sRGB=MagickFalse; 1154603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickFalse; 11547a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 1154803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickFalse; 1154903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickFalse; 1155003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickFalse; 1155103812ae402fb53d548f0e1d7d14720768f803c2dglennrp i--; 1155203812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 115532cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1155403812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"none",4) == 0) 1155503812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 1155603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickTrue; 1155703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickTrue; 11558a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 1155903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickTrue; 1156003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickTrue; 1156103812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickTrue; 1156203812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* mng_info->ping_exclude_iTXt=MagickTrue; */ 1156303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickTrue; 1156403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickTrue; 1156503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_sRGB=MagickTrue; 1156603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickTrue; 11567a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 1156803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickTrue; 1156903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickTrue; 1157003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickTrue; 1157103812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 115722cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1157303812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"bkgd",4) == 0) 1157403812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_bKGD=MagickFalse; 115752cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1157603812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"chrm",4) == 0) 1157703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_cHRM=MagickFalse; 115782cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11579a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (LocaleNCompare(value+i,"date",4) == 0) 11580a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 11581a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 1158203812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"exif",4) == 0) 1158303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_EXIF=MagickFalse; 115842cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1158503812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"gama",4) == 0) 1158603812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickFalse; 115872cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1158803812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"iccp",4) == 0) 1158903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iCCP=MagickFalse; 115902cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1159103812ae402fb53d548f0e1d7d14720768f803c2dglennrp /* 1159203812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"itxt",4) == 0) 1159303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_iTXt=MagickFalse; 1159403812ae402fb53d548f0e1d7d14720768f803c2dglennrp */ 115952cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1159603812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"gama",4) == 0) 1159703812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_gAMA=MagickFalse; 115982cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1159903812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"offs",4) == 0) 1160003812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_oFFs=MagickFalse; 116012cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1160203812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"phys",4) == 0) 1160303812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_pHYs=MagickFalse; 116042cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11605a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (LocaleNCompare(value+i,"srgb",4) == 0) 11606a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_sRGB=MagickFalse; 116072cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1160803812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"text",4) == 0) 1160903812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_tEXt=MagickFalse; 116102cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11611a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (LocaleNCompare(value+i,"trns",4) == 0) 11612a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 11613a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp 1161403812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"vpag",4) == 0) 1161503812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_vpAg=MagickFalse; 116162cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1161703812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"zccp",4) == 0) 1161803812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zCCP=MagickFalse; 116192cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1162003812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (LocaleNCompare(value+i,"ztxt",4) == 0) 1162103812ae402fb53d548f0e1d7d14720768f803c2dglennrp mng_info->ping_exclude_zTXt=MagickFalse; 116222cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1162303812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 11624ce91ed5de546373b90d60e2efd118e76692dc416glennrp } 1162526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1162626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1162703812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (excluding != MagickFalse && logging != MagickFalse) 1162826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1162926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 116305d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Chunks to be excluded from the output png:"); 1163126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_bKGD != MagickFalse) 1163226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1163326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " bKGD"); 1163426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_cHRM != MagickFalse) 1163526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1163626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " cHRM"); 11637a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (mng_info->ping_exclude_date != MagickFalse) 11638a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11639a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp " date"); 1164026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_EXIF != MagickFalse) 1164126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1164226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " EXIF"); 1164326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_gAMA != MagickFalse) 1164426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1164526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " gAMA"); 1164626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iCCP != MagickFalse) 1164726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1164826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iCCP"); 1164926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp/* 1165026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iTXt != MagickFalse) 1165126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1165226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iTXt"); 1165326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp*/ 1165426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_oFFs != MagickFalse) 1165526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1165626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " oFFs"); 1165726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_pHYs != MagickFalse) 1165826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1165926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " pHYs"); 1166026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_sRGB != MagickFalse) 1166126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1166226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " sRGB"); 1166326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_tEXt != MagickFalse) 1166426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1166526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " tEXt"); 11666a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (mng_info->ping_exclude_tRNS != MagickFalse) 11667a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11668a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp " tRNS"); 1166926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_vpAg != MagickFalse) 1167026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1167126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " vpAg"); 1167226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zCCP != MagickFalse) 1167326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1167426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zCCP"); 1167526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zTXt != MagickFalse) 1167626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1167726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zTXt"); 1167826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1167926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 11680b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickTrue; 116813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1168216ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 116833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 116850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 116863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 116873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WritePNGImage()"); 116880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 116893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 116903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 116913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 116933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Write one JNG image */ 116953ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOneJNGImage(MngInfo *mng_info, 1169616ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *image_info,Image *image,ExceptionInfo *exception) 116973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 116983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 116993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image; 117003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 117023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image_info; 117033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1170503812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 117063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 117073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 117093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 117103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 117123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blob, 117133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[80], 117143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 117153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 117173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 117183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 117193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 117203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent; 117213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11722bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1172359575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality, 117243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_quality; 117253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 11727fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOneJNGImage()"); 117283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) NULL; 117303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=(Image *) NULL; 117313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) NULL; 117323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickTrue; 117343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent=image_info->type==GrayscaleMatteType || 1173559575fa5c228308a41d7f5028390be2083aaaf6dglennrp image_info->type==TrueColorMatteType || image->matte != MagickFalse; 117363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1173759575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_quality=image_info->quality == 0UL ? 75UL : image_info->quality%1000; 1173859575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1173959575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=image->compression==JPEGCompression? 8 : 0; 1174059575fa5c228308a41d7f5028390be2083aaaf6dglennrp 11741750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp jng_alpha_quality=image_info->quality == 0UL ? 75UL : 1174259575fa5c228308a41d7f5028390be2083aaaf6dglennrp image_info->quality; 1174359575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1174459575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (jng_alpha_quality >= 1000) 1174559575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality /= 1000; 117463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 117483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 117493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=14; 117500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Create JPEG blob, image, and image_info */ 117523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1175416ea139d53d867211d3bb0fa859a83de653f687ecristy " Creating jpeg_image_info for alpha."); 117550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 117570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 117593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 117600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 117633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 117640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1176516ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=SeparateImage(image,AlphaChannel,exception); 117663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 117673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 117683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 117693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->matte=MagickFalse; 117708f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp jpeg_image->quality=jng_alpha_quality; 1177116ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image_info->type=GrayscaleType; 1177216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(jpeg_image,GrayscaleType,exception); 117733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 117743b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(jpeg_image_info->filename,MaxTextExtent, 117753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",jpeg_image->filename); 117763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1177759575fa5c228308a41d7f5028390be2083aaaf6dglennrp else 1177859575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1177959575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=0; 1178059575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_color_type=10; 1178159575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_sample_depth=0; 1178259575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 117833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: check bit depth of PNG alpha channel */ 117853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if image is grayscale. */ 117873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->type != TrueColorMatteType && image_info->type != 1178816ea139d53d867211d3bb0fa859a83de653f687ecristy TrueColorType && ImageIsGray(image,exception)) 117893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type-=2; 117903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1179159575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (logging != MagickFalse) 1179259575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1179359575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1179459575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Quality = %d",(int) jng_quality); 1179559575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1179659575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Color Type = %d",jng_color_type); 1179759575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (transparent) 1179859575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1179959575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1180059575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Compression = %d",jng_alpha_compression_method); 1180159575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1180259575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Depth = %d",jng_alpha_sample_depth); 1180359575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1180459575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Quality = %d",(int) jng_alpha_quality); 1180559575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1180659575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1180759575fa5c228308a41d7f5028390be2083aaaf6dglennrp 118083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 118093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 118103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 118113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 118123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 118133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 118143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1181516ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale PNG blob */ 118163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1181716ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 118183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 118193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 118203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating PNG blob."); 118213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=0; 118223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"PNG",MaxTextExtent); 118243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"PNG",MaxTextExtent); 118253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 118263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11827cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* Exclude all ancillary chunks */ 11828cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp (void) SetImageArtifact(jpeg_image,"png:exclude-chunks","all"); 11829cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 118303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, 1183116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 118323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Retrieve sample depth used */ 1183416ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(jpeg_image,"png:bit-depth-written",exception); 118353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 118363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth= (unsigned int) value[0]; 118373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 118383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 118393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1184016ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale JPEG blob */ 118413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1184316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 118443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); 118463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 118473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 118483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 118493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 118503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 118513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length, 1185216ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 118533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 118540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 118553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 118563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11857e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 11858e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 118593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 118613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Destroy JPEG image and image_info */ 118623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 118633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 118643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 118653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 118663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 118673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JHDR chunk */ 118683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,16L); /* chunk data length=16 */ 118693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JHDR); 1187003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JHDR,16L); 118714e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) image->columns); 118724e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) image->rows); 118733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=jng_color_type; 118743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[13]=8; /* sample depth */ 118753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=8; /*jng_image_compression_method */ 118763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[15]=(unsigned char) (image_info->interlace == NoInterlace ? 0 : 8); 118773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[16]=jng_alpha_sample_depth; 118783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[17]=jng_alpha_compression_method; 118793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[18]=0; /*jng_alpha_filter_method */ 118803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[19]=0; /*jng_alpha_interlace_method */ 118813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,20,chunk); 118823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); 118833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 118843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 118853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11886f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG width:%15lu",(unsigned long) image->columns); 118870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 118883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11889f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG height:%14lu",(unsigned long) image->rows); 118900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 118913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 118923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG color type:%10d",jng_color_type); 118930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 118943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 118953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG sample depth:%8d",8); 118960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 118973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 118983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG compression:%9d",8); 118990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 119013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG interlace:%11d",0); 119020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 119043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha depth:%9d",jng_alpha_sample_depth); 119050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 119073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha compression:%3d",jng_alpha_compression_method); 119080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 119103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha filter:%8d",0); 119110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 119133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha interlace:%5d",0); 119143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 119153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* Write any JNG-chunk-b profiles */ 11917cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-b",logging); 119183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 119203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write leading ancillary chunks 119213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 119223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 119243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 119253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 119263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG bKGD chunk 119273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 119283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 119303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue, 119313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 119323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red; 119333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11934bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 119353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes; 119363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 119383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=6L; 119393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 119403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=10L; 11941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) (num_bytes-4L)); 119423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1194303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,(size_t) (num_bytes-4L)); 119443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToChar(image->background_color.red); 119453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToChar(image->background_color.green); 119463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToChar(image->background_color.blue); 119473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+4)=0; 119483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+5)=red; 119493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+6)=0; 119503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+7)=green; 119513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+8)=0; 119523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+9)=blue; 119533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) num_bytes,chunk); 119543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) num_bytes)); 119553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 119563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 119573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent)) 119583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 119593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 119603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG sRGB chunk 119613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 119623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 119633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1196403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 119650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 11967e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 11968cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 11969e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 119700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 11972e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 11973cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 11974e610a071534e448c46460a5aa39ede33bf56b329glennrp (PerceptualIntent)); 119750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 119773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 119783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 119793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 119803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 119813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma != 0.0) 119823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 119833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 119843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG gAMA chunk 119853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 119863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 119873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1198803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1198935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 119903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 119913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 119923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 119930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 119943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->equal_chrms == MagickFalse) && 119953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->chromaticity.red_primary.x != 0.0)) 119963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 119973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 119983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 119993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 120003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 120013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG cHRM chunk 120023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 120033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 120043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1200503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 120063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1200735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1200835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 120093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1201035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1201135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 120123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1201335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1201435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 120153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1201635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1201735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 120183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 120193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 120203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1202316ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && !mng_info->equal_physs) 120243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 120263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG pHYs chunk 120273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 120283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 120293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1203003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 120313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 120323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1203335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1203416ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 120350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1203635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1203716ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 120380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 120393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 120403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 120423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 120433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 120453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1204635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1204716ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 120480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1204935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1205016ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 120510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 120523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 120533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 120553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 120563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1205716ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1205816ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 120593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 120603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 120633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 120643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 120663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.x || image->page.y)) 120673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 120693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG oFFs chunk 120703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 120713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 120723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_oFFs); 1207303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_oFFs,9L); 12074bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+4,(ssize_t) (image->page.x)); 12075bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+8,(ssize_t) (image->page.y)); 120763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 120773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 120783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 120793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.width || image->page.height)) 120813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 120833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_vpAg); 1208403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 120853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+4,(png_uint_32) image->page.width); 120863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) image->page.height); 120873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; /* unit = pixels */ 120883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 120893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 120903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 120913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 120923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 120933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (transparent) 120943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 120953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 120963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12097bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 120983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 120993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12100bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 121013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len; 121023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IDAT chunk header */ 121043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12106e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write IDAT chunks from blob, length=%.20g.",(double) 12107f2faecf9facdbbb14fcba373365f9f691a9658e0cristy length); 121083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Copy IDAT chunks */ 121103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=0; 121113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=blob+8; 12112bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=8; i<(ssize_t) length; i+=len+12) 121133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 121143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=(*p<<24)|((*(p+1))<<16)|((*(p+2))<<8)|(*(p+3)); 121153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 121160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*(p)==73 && *(p+1)==68 && *(p+2)==65 && *(p+3)==84) /* IDAT */ 121183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 121193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Found an IDAT chunk. */ 12120bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) len); 1212103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IDAT,(size_t) len); 121223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) len+4,p); 121233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image, 121243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(0,p,(uInt) len+4)); 121253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 121283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 121293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12131e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping %c%c%c%c chunk, length=%.20g.", 12132e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy *(p),*(p+1),*(p+2),*(p+3),(double) len); 121333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=(8+len); 121353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 121383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 121393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAA chunk header */ 121403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12142e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAA chunk, length=%.20g.",(double) length); 12143bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 121443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAA); 1214503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAA,length); 121463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) data */ 121473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 121483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 121493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob, 121503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) length)); 121513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 121533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 121543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode image as a JPEG blob */ 121563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 121583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image_info."); 121593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 121603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 121613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 121623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 121653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 121663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1216716ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=CloneImage(image,0,0,MagickTrue,exception); 121683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 121693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 121703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 121713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 121733b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(jpeg_image_info->filename,MaxTextExtent,"%s", 121743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->filename); 121753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1217716ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 121783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12181e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Created jpeg_image, %.20g x %.20g.",(double) jpeg_image->columns, 12182e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) jpeg_image->rows); 121833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 121853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->type=GrayscaleType; 121860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1218759575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image_info->quality=jng_quality; 1218859575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image->quality=jng_quality; 121893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MaxTextExtent); 121903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MaxTextExtent); 121910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 121943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 121950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1219616ea139d53d867211d3bb0fa859a83de653f687ecristy blob=ImageToBlob(jpeg_image_info,jpeg_image,&length,exception); 121970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 122003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12201e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 12202e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 122033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12205e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAT chunk, length=%.20g.",(double) length); 122063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 122070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) */ 12209bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 122103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAT); 1221103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAT,length); 122123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 122133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 122143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob,(uInt) length)); 122153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 122173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 122183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 122193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 122203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write any JNG-chunk-e profiles */ 12222cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-e",logging); 122233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IEND chunk */ 122253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0L); 122263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_IEND); 1222703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0); 122283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 122293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 122303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 122323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 122333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOneJNGImage()"); 122340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 122363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 122373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 122403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 122413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e J N G I m a g e % 122453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 122483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 122493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteJNGImage() writes a JPEG Network Graphics (JNG) image file. 122513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 122533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteJNGImage method is: 122553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1225616ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteJNGImage(const ImageInfo *image_info, 1225716ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 122583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 122603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 122623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 122633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 122643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1226516ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1226616ea139d53d867211d3bb0fa859a83de653f687ecristy% 122673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 122683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1226916ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image, 1227016ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 122713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 122723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1227321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 1227403812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 122753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 122763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 122783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 122793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 122813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 122823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 122833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 122843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 122853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 122863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 122873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12288fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteJNGImage()"); 1228916ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 122903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 122913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 122923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 122943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 122953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 122963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1229773bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 122983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 122993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 123003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 123013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 123023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 123033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 123043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 123053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 123063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\213JNG\r\n\032\n"); 123083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1230916ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,image_info,image,exception); 123103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 123113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 123133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 123143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteJNGImage()"); 123163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 123173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 123183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 123193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1232016ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image, 1232116ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 123223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 123233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 123243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *option; 123253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 123273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image; 123283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1233021f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 123313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 123323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1233303812ae402fb53d548f0e1d7d14720768f803c2dglennrp volatile MagickBooleanType 1233403812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging; 1233503812ae402fb53d548f0e1d7d14720768f803c2dglennrp 123363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 123373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 123383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 123403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count, 123413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations, 123423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte; 123433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 123453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 123463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 123473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte, 123483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 123493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray, 123503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi, 123513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte; 123523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12353bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 123543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 123553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 123573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[800]; 123583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 123603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng, 123613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng; 123623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12363bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 123643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 123653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12366bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 123673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=0, 123683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay; 123693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12370d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER < 10200) 123713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 123723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 123733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 123743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 123753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 123773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 123783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 123793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 123803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info->signature == MagickSignature); 123813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 123823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image->signature == MagickSignature); 123833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12384fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteMNGImage()"); 1238516ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 123863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 123873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 123883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 123903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 123913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 123923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1239373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 123943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 123953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 123963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 123973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 123983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 123993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 124003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 124013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 124023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng=LocaleCompare(image_info->magick,"MNG") == 0; 124033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See if user has requested a specific PNG subformat to be used 124063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * for all of the PNGs in the MNG being written, e.g., 124073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 124083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * convert *.png png8:animation.mng 124093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 124103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * To do: check -define png:bit_depth and png:color_type as well, 124113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * or perhaps use mng:bit_depth and mng:color_type instead for 124123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * global settings. 124133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 124163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 124173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 124183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickFalse; 124203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 124213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickTrue; 124223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->adjoin=image_info->adjoin && 124243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && write_mng; 124253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 124273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Log some info about the input */ 124293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 124303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 124313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Checking input image(s)"); 124340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12436e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image_info depth: %.20g",(double) image_info->depth); 124370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Type: %d",image_info->type); 124403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 124423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 124433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12445e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Scene: %.20g",(double) scene++); 124460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12448e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image depth: %.20g",(double) p->depth); 124490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->matte) 124513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: True"); 124530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: False"); 124570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->storage_class == PseudoClass) 124593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: PseudoClass"); 124610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: DirectClass"); 124650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->colors) 124673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12468e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Number of colors: %.20g",(double) p->colors); 124690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Number of colors: unspecified"); 124730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 124753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 124763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 124803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 124813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 124823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 124833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 124843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickFalse; 124853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickFalse; 124863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 124873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=1; 124883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 124903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->page != (char *) NULL) 124913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine image bounding box. 124943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetGeometry(image,&mng_info->page); 124963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseMetaGeometry(image_info->page,&mng_info->page.x, 124973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &mng_info->page.y,&mng_info->page.width,&mng_info->page.height); 124983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 125003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 125023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom; 125033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 125053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red, 125063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 125073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue; 125083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 125103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickTrue; 125113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.width || mng_info->page.height) 125123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickFalse; 125133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Check all the scenes. 125153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay=image->delay; 125173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 125183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=image->chromaticity.red_primary.x != 0.0; 125193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickTrue, 125203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickTrue; 125213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickTrue; 125223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickTrue; 125233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 125243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 125253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 125263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickTrue; 125273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 125283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickFalse; 125293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 125303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next_image=image; next_image != (Image *) NULL; ) 125313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_geom) 125333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->columns+next_image->page.x) > mng_info->page.width) 125353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.width=next_image->columns+next_image->page.x; 125360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->rows+next_image->page.y) > mng_info->page.height) 125383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.height=next_image->rows+next_image->page.y; 125393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->page.x || next_image->page.y) 125423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickTrue; 125430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->matte) 125453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickTrue; 125460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) next_image->dispose >= BackgroundDispose) 125483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->matte || next_image->page.x || next_image->page.y || 125493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((next_image->columns < mng_info->page.width) && 125503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->rows < mng_info->page.height))) 125513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 125520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->iterations) 125543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickTrue; 125550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=next_image->delay; 125570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != initial_delay || final_delay > 1UL* 125593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->ticks_per_second) 125603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=1; 125610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 125633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 125643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check for global palette possibility. 125663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->matte != MagickFalse) 125683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 125690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte == 0) 125713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1257216ea139d53d867211d3bb0fa859a83de653f687ecristy if (ImageIsGray(image,exception) == MagickFalse) 125733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 125743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,next_image); 125753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (use_global_plte == 0) 125763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=mng_info->equal_palettes; 125773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=!mng_info->equal_palettes; 125783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 125803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(next_image) != (Image *) NULL) 125813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->background_color.red != 125833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.red || 125843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.green != 125853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.green || 125863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.blue != 125873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.blue) 125883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 125890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->gamma != next_image->next->gamma) 125913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 125920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->rendering_intent != 125943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->rendering_intent) 125953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 125960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->units != next_image->next->units) || 1259816ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.x != next_image->next->resolution.x) || 1259916ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.y != next_image->next->resolution.y)) 126003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 126010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 126033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->chromaticity.red_primary.x != 126053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.x || 126063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.red_primary.y != 126073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.y || 126083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.x != 126093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.x || 126103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.y != 126113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.y || 126123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.x != 126133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.x || 126143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.y != 126153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.y || 126163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.x != 126173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.x || 126183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.y != 126193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.y) 126203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 126213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 126243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next_image); 126253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count < 2) 126273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 126293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 126303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 126313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 126323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 126333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 126343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 126353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 126363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 126373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 126383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram == MagickFalse) 126413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 126433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Only certain framing rates 100/n are exactly representable without 126443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the FRAM chunk but we'll allow some slop in VLC files 126453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 126463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay == 0) 126473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_iterations != MagickFalse) 126493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 126513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy It's probably a GIF with loop; don't run it *too* fast. 126523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 126530261712cdc8fb4765add50146936e3ba2cb9fefaglennrp if (mng_info->adjoin) 12654d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp { 12655d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp final_delay=10; 1265616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 1265716ea139d53d867211d3bb0fa859a83de653f687ecristy CoderWarning, 12658d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp "input has zero delay between all frames; assuming", 12659d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp " 10 cs `%s'",""); 12660d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp } 126613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 126633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=0; 126643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != 0) 12666cf002022280cc4dedb2748ad6f415aac1d44f530glennrp mng_info->ticks_per_second=(png_uint_32) 12667cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (image->ticks_per_second/final_delay); 126683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 50) 126693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=2; 126700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 75) 126723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1; 126730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 125) 126753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 126760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi && final_delay > 2 && (final_delay != 4) && 126783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 5) && (final_delay != 10) && (final_delay != 20) && 126793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 25) && (final_delay != 50) && (final_delay != 126803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1UL*image->ticks_per_second)) 126813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; /* make it exact; cannot be VLC */ 126823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram != MagickFalse) 126853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 126863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 126873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If pseudocolor, we should also check to see if all the 126883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palettes are identical and write a global PLTE if they are. 126893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ../glennrp Feb 99. 126903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 126913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 126923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MNG version 1.0 signature and MHDR chunk. 126933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 126943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\212MNG\r\n\032\n"); 126953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,28L); /* chunk data length=28 */ 126963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MHDR); 1269703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MHDR,28L); 126984e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) mng_info->page.width); 126994e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.height); 127003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,mng_info->ticks_per_second); 127013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+16,0L); /* layer count=unknown */ 127023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+20,0L); /* frame count=unknown */ 127033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+24,0L); /* play time=unknown */ 127043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_jng) 127053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 127073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 127093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,27L); /* simplicity=LC+JNG */ 127100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,25L); /* simplicity=VLC+JNG */ 127133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 127183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,19L); /* simplicity=LC+JNG, no transparency */ 127190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,17L); /* simplicity=VLC+JNG, no transparency */ 127223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 127283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 127303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,11L); /* simplicity=LC */ 127310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,9L); /* simplicity=VLC */ 127343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 127393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,3L); /* simplicity=LC, no transparency */ 127400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,1L); /* simplicity=VLC, no transparency */ 127433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,32,chunk); 127463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,32)); 127473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy option=GetImageOption(image_info,"mng:need-cacheoff"); 127483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (option != (const char *) NULL) 127493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 127513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 127523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 127543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write "nEED CACHEOFF" to turn playback caching off for streaming MNG. 127553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 127563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_nEED); 127573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=CopyMagickString((char *) chunk+4,"CACHEOFF",20); 12758bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 1275903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_nEED,(size_t) length); 127603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length+=4; 127613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,chunk); 127623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) length)); 127633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((GetPreviousImageInList(image) == (Image *) NULL) && 127653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && 127663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->iterations != 1)) 127673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 127693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG TERM chunk 127703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 127713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 127723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_TERM); 1277303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_TERM,10L); 127743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=3; /* repeat animation */ 127753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* show last frame when done */ 127763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+6,(png_uint_32) (mng_info->ticks_per_second* 127773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/MagickMax(image->ticks_per_second,1))); 127780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 127803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,PNG_UINT_31_MAX); 127810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) image->iterations); 127840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12788e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM delay: %.20g",(double) (mng_info->ticks_per_second* 12789e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy final_delay/MagickMax(image->ticks_per_second,1))); 127900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 127923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12793e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM iterations: %.20g",(double) PNG_UINT_31_MAX); 127940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 127963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12797e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image iterations: %.20g",(double) image->iterations); 127983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 128003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 128013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 128023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 128043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent) && 128063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs) 128073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG sRGB chunk 128103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 128123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1281303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 128140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 12816e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12817cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12818e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 128190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 12821e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12822cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12823cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (PerceptualIntent)); 128240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 128263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 128273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_srgb=MagickTrue; 128283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 128290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 128313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma && mng_info->equal_gammas) 128333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG gAMA chunk 128363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 128383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1283903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1284035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 128413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 128423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 128433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_gama=MagickTrue; 128443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 128453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 128463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 128483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 128493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG cHRM chunk 128523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 128543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1285503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 128563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1285735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1285835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 128593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1286035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1286135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 128623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1286335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1286435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 128653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1286635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1286735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 128683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 128693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 128703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_chrm=MagickTrue; 128713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 128723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1287316ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && mng_info->equal_physs) 128743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG pHYs chunk 128773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 128793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1288003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 128810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 128833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1288435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1288516ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 128860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1288735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1288816ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 128890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 128913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 128920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 128933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 128943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 128953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 128963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1289735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1289816ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 128990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1290035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1290116ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 129020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 129043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1290816ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1290916ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 129103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 129113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 129143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 129153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG BACK chunk and global bKGD chunk, if the image is transparent 129183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy or does not cover the entire frame. 129193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng && (image->matte || image->page.x > 0 || 129213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y > 0 || (image->page.width && 129223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->page.width+image->page.x < mng_info->page.width)) 129233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy || (image->page.height && (image->page.height+image->page.y 129243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy < mng_info->page.height)))) 129253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 129273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_BACK); 1292803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_BACK,6L); 129293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToShort(image->background_color.red); 129303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToShort(image->background_color.green); 129313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToShort(image->background_color.blue); 129323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+4,red); 129333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+6,green); 129343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+8,blue); 129353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 129363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 129373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_backgrounds) 129383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 129403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1294103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,6L); 129423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 129433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 129443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 129483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((need_local_plte == MagickFalse) && 129493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class == PseudoClass) && 129503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (all_images_are_gray == MagickFalse)) 129513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12952bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 129533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 129543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 129573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 129593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 129603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1296103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 129620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12963bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 129643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1296516ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[4+i*3]=(unsigned char) (ScaleQuantumToChar( 1296616ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red) & 0xff); 1296716ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[5+i*3]=(unsigned char) (ScaleQuantumToChar( 1296816ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green) & 0xff); 1296916ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[6+i*3]=(unsigned char) (ScaleQuantumToChar( 1297016ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue) & 0xff); 129713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 129743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) (data_length+4))); 129753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 129763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 129783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 129803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->delay=0; 129813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 129823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 129833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 129843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 129853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 129863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin) 129883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 129903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 129913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If we aren't using a global palette for the entire MNG, check to 129933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy see if we can use one for two or more consecutive images. 129943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte && use_global_plte && !all_images_are_gray) 129963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 129983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy When equal_palettes is true, this image has the same palette 130013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy as the previous PseudoClass image 130023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=mng_info->equal_palettes; 130043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,image->next); 130053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_palettes && !mng_info->have_write_global_plte) 130063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 130093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 13010bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 130113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 130123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 130143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 130153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1301603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 130170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13018bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 130193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red); 130213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green); 130223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue); 130233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 130263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk, 130273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) (data_length+4))); 130283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 130293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 130323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickFalse; 130333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 130353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi) 130363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13037bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 130383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x, 130393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y; 130403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scene) 130423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=mng_info->page.x; 130443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=mng_info->page.y; 130453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 130473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=0; 130493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=0; 130503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 130523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->page.x != previous_x) || 130533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->page.y != previous_y)) 130543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,12L); /* data length=12 */ 130563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_DEFI); 1305703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_DEFI,12L); 130583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=0; /* object 0 MSB */ 130593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* object 0 LSB */ 130603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=0; /* visible */ 130613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* abstract */ 130623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.x); 130633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,(png_uint_32) mng_info->page.y); 130643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,16,chunk); 130653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,16)); 130663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_mng=write_mng; 130713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) image->dispose >= 3) 130733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 130743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && mng_info->adjoin && 130763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->delay != mng_info->delay) || 130773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->framing_mode != mng_info->old_framing_mode))) 130783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay == mng_info->delay) 130803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the new framing mode. 130833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); /* data length=1 */ 130853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1308603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,1L); 130873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 130883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 130893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 130903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 130923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the delay. 130953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 130973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1309803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,10L); 130993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 131003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 131013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=2; /* flag for changing default delay */ 131023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 131033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=0; /* flag for changing frame clipping */ 131043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 131053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) 131063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((mng_info->ticks_per_second* 131073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay)/MagickMax(image->ticks_per_second,1))); 131083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 131093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 131104e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy mng_info->delay=(png_uint_32) image->delay; 131113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=mng_info->framing_mode; 131133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 131153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 131163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 131173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 131193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_info; 131203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 131213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 131223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 131233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing JNG object."); 131243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: specify the desired alpha compression method. */ 131253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=CloneImageInfo(image_info); 131263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info->compression=UndefinedCompression; 1312716ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,write_info,image,exception); 131283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=DestroyImageInfo(write_info); 131293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 131313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 131323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 131343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 131353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG object."); 131362f2e514554975d510c88df54de98c6cdc1080f1cglennrp 13137b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickFalse; 131388d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap = MagickFalse; 131392f2e514554975d510c88df54de98c6cdc1080f1cglennrp 131402f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* We don't want any ancillary chunks written */ 131412f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_bKGD=MagickTrue; 131422f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_cHRM=MagickTrue; 13143a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 131442f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_EXIF=MagickTrue; 131452f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_gAMA=MagickTrue; 131462f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_iCCP=MagickTrue; 131472f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* mng_info->ping_exclude_iTXt=MagickTrue; */ 131482f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_oFFs=MagickTrue; 131492f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_pHYs=MagickTrue; 131502f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_sRGB=MagickTrue; 131512f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_tEXt=MagickTrue; 13152a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 131532f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_vpAg=MagickTrue; 131542f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zCCP=MagickTrue; 131552f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zTXt=MagickTrue; 131562f2e514554975d510c88df54de98c6cdc1080f1cglennrp 1315716ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 131583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 131603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 131613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 131633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 131643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 131653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 131673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 131683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 131693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 131703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,SaveImagesTag,scene++, 131713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(image)); 131720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 131743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 131750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (mng_info->adjoin); 131770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 131793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 131813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 131823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MEND chunk. 131843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0x00000000L); 131863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MEND); 1318703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MEND,0L); 131883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 131893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 131903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 131933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 131953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 131960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 131983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()"); 131990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 132013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13202d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#else /* PNG_LIBPNG_VER > 10011 */ 1320339992b4dd9b12ef752d55b8e402c069698851f72glennrp 132043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) 132053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 132063bd393f9074299ed9f2f3d128e4985118077c2bdglennrp (void) image; 132073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 132083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 132090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(CoderError,"PNG library is too old", 132113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 132123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1321339992b4dd9b12ef752d55b8e402c069698851f72glennrp 132143ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 132153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 132163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(WritePNGImage(image_info,image)); 132173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13218d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 132193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13220