png.c revision 68a6b50ae30f5a551cd31d6e4b0c72990897a84f
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 % 16de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy% Cristy % 173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Glenn Randers-Pehrson % 183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% November 1997 % 193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 217ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy% Copyright 1999-2016 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 132ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp/* Table of recognized sRGB ICC profiles */ 133ecab7d7b7fc598881ff3c72240381caa5c444a56glennrpstruct sRGB_info_struct 134ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp{ 135ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_uint_32 len; 136ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_uint_32 crc; 137ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_byte intent; 138ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp}; 139ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 140ecab7d7b7fc598881ff3c72240381caa5c444a56glennrpconst struct sRGB_info_struct sRGB_info[] = 1416647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp{ 142c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* ICC v2 perceptual sRGB_IEC61966-2-1_black_scaled.icc */ 143ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 3048, 0x3b8772b9UL, 0}, 144ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 145c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* ICC v2 relative sRGB_IEC61966-2-1_no_black_scaling.icc */ 146ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 3052, 0x427ebb21UL, 1}, 147ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 148c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* ICC v4 perceptual sRGB_v4_ICC_preference_displayclass.icc */ 149ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp {60988, 0x306fd8aeUL, 0}, 150ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 151c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* ICC v4 perceptual sRGB_v4_ICC_preference.icc perceptual */ 152ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp {60960, 0xbbef7812UL, 0}, 153ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 154c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* HP? sRGB v2 media-relative sRGB_IEC61966-2-1_noBPC.icc */ 155ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 3024, 0x5d5129ceUL, 1}, 156ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 157ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* HP-Microsoft sRGB v2 perceptual */ 158ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 3144, 0x182ea552UL, 0}, 159ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 160ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* HP-Microsoft sRGB v2 media-relative */ 161ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 3144, 0xf29e526dUL, 1}, 162ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 163c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* Facebook's "2012/01/25 03:41:57", 524, "TINYsRGB.icc" */ 164c241d3cdc951647513766801b3f1cfc74b773b5eglennrp { 524, 0xd4938c39UL, 0}, 165c241d3cdc951647513766801b3f1cfc74b773b5eglennrp 166c241d3cdc951647513766801b3f1cfc74b773b5eglennrp /* "2012/11/28 22:35:21", 3212, "Argyll_sRGB.icm") */ 167c241d3cdc951647513766801b3f1cfc74b773b5eglennrp { 3212, 0x034af5a1UL, 0}, 168c241d3cdc951647513766801b3f1cfc74b773b5eglennrp 169ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* Not recognized */ 170ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 0, 0x00000000UL, 0}, 171ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp}; 172ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 1738e58efdecda887b08ef730d68290a61081ef2566glennrp/* Macros for left-bit-replication to ensure that pixels 17416ea139d53d867211d3bb0fa859a83de653f687ecristy * and PixelInfos all have the same image->depth, and for use 1758e58efdecda887b08ef730d68290a61081ef2566glennrp * in PNG8 quantization. 1768e58efdecda887b08ef730d68290a61081ef2566glennrp */ 1778e58efdecda887b08ef730d68290a61081ef2566glennrp 1788e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR01: Replicate top bit */ 1798e58efdecda887b08ef730d68290a61081ef2566glennrp 18005001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR01PacketRed(pixelpacket) \ 1818e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=(ScaleQuantumToChar((pixelpacket).red) < 0x10 ? \ 1828e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1838e58efdecda887b08ef730d68290a61081ef2566glennrp 18491d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketGreen(pixelpacket) \ 1858e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=(ScaleQuantumToChar((pixelpacket).green) < 0x10 ? \ 1868e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1878e58efdecda887b08ef730d68290a61081ef2566glennrp 18891d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketBlue(pixelpacket) \ 1898e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=(ScaleQuantumToChar((pixelpacket).blue) < 0x10 ? \ 1908e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1918e58efdecda887b08ef730d68290a61081ef2566glennrp 19216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PacketAlpha(pixelpacket) \ 19316ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=(ScaleQuantumToChar((pixelpacket).alpha) < 0x10 ? \ 1948e58efdecda887b08ef730d68290a61081ef2566glennrp 0 : QuantumRange); 1958e58efdecda887b08ef730d68290a61081ef2566glennrp 19691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketRGB(pixelpacket) \ 197bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 19805001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR01PacketRed((pixelpacket)); \ 19991d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketGreen((pixelpacket)); \ 20091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketBlue((pixelpacket)); \ 201bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2028e58efdecda887b08ef730d68290a61081ef2566glennrp 20391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR01PacketRGBO(pixelpacket) \ 204bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 20591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGB((pixelpacket)); \ 20616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PacketAlpha((pixelpacket)); \ 207bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2088e58efdecda887b08ef730d68290a61081ef2566glennrp 209ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR01PixelRed(pixel) \ 210360c1549eac5e4759deeaf2a80b027498bea291eglennrp (SetPixelRed(image, \ 211360c1549eac5e4759deeaf2a80b027498bea291eglennrp ScaleQuantumToChar(GetPixelRed(image,(pixel))) < 0x10 ? \ 212c7375f9f4105dd03f69c115a3d9c1a2087d1742bglennrp 0 : QuantumRange,(pixel))); 2138e58efdecda887b08ef730d68290a61081ef2566glennrp 21454cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelGreen(pixel) \ 215360c1549eac5e4759deeaf2a80b027498bea291eglennrp (SetPixelGreen(image, \ 216360c1549eac5e4759deeaf2a80b027498bea291eglennrp ScaleQuantumToChar(GetPixelGreen(image,(pixel))) < 0x10 ? \ 217c7375f9f4105dd03f69c115a3d9c1a2087d1742bglennrp 0 : QuantumRange,(pixel))); 2188e58efdecda887b08ef730d68290a61081ef2566glennrp 21954cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelBlue(pixel) \ 220360c1549eac5e4759deeaf2a80b027498bea291eglennrp (SetPixelBlue(image, \ 221360c1549eac5e4759deeaf2a80b027498bea291eglennrp ScaleQuantumToChar(GetPixelBlue(image,(pixel))) < 0x10 ? \ 222c7375f9f4105dd03f69c115a3d9c1a2087d1742bglennrp 0 : QuantumRange,(pixel))); 2238e58efdecda887b08ef730d68290a61081ef2566glennrp 22416ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PixelAlpha(pixel) \ 225360c1549eac5e4759deeaf2a80b027498bea291eglennrp (SetPixelAlpha(image, \ 226360c1549eac5e4759deeaf2a80b027498bea291eglennrp ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) < 0x10 ? \ 227c7375f9f4105dd03f69c115a3d9c1a2087d1742bglennrp 0 : QuantumRange,(pixel))); 2288e58efdecda887b08ef730d68290a61081ef2566glennrp 22954cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR01PixelRGB(pixel) \ 230bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 231ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR01PixelRed((pixel)); \ 23254cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelGreen((pixel)); \ 23354cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelBlue((pixel)); \ 234bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2358e58efdecda887b08ef730d68290a61081ef2566glennrp 23616ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR01PixelRGBA(pixel) \ 237bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 23854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR01PixelRGB((pixel)); \ 23916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PixelAlpha((pixel)); \ 240bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2418e58efdecda887b08ef730d68290a61081ef2566glennrp 2428e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR02: Replicate top 2 bits */ 2438e58efdecda887b08ef730d68290a61081ef2566glennrp 24405001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR02PacketRed(pixelpacket) \ 2458e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2468e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xc0; \ 2478e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum( \ 2488e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2498e58efdecda887b08ef730d68290a61081ef2566glennrp } 25091d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketGreen(pixelpacket) \ 2518e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2528e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xc0; \ 2538e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum( \ 2548e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2558e58efdecda887b08ef730d68290a61081ef2566glennrp } 25691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketBlue(pixelpacket) \ 2578e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 2588e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xc0; \ 2598e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum( \ 2608e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2618e58efdecda887b08ef730d68290a61081ef2566glennrp } 26216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PacketAlpha(pixelpacket) \ 2638e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 26416ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).alpha) & 0xc0; \ 26516ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleCharToQuantum( \ 2668e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))); \ 2678e58efdecda887b08ef730d68290a61081ef2566glennrp } 2688e58efdecda887b08ef730d68290a61081ef2566glennrp 26991d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketRGB(pixelpacket) \ 270bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 27105001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR02PacketRed((pixelpacket)); \ 27291d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketGreen((pixelpacket)); \ 27391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue((pixelpacket)); \ 274bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2758e58efdecda887b08ef730d68290a61081ef2566glennrp 27691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR02PacketRGBO(pixelpacket) \ 277bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 27891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGB((pixelpacket)); \ 27916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PacketAlpha((pixelpacket)); \ 280bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 2818e58efdecda887b08ef730d68290a61081ef2566glennrp 282ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR02PixelRed(pixel) \ 2838e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 28416ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 2858e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xc0; \ 28616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image, ScaleCharToQuantum( \ 28716ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 28816ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 2898e58efdecda887b08ef730d68290a61081ef2566glennrp } 29054cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelGreen(pixel) \ 2918e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 29216ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 2938e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xc0; \ 29416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image, ScaleCharToQuantum( \ 29516ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 29616ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 2978e58efdecda887b08ef730d68290a61081ef2566glennrp } 29854cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelBlue(pixel) \ 2998e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3008e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 30116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,(pixel))) & 0xc0; \ 30216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image, ScaleCharToQuantum( \ 30316ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 30416ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel)); \ 3058e58efdecda887b08ef730d68290a61081ef2566glennrp } 30616ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PixelAlpha(pixel) \ 3078e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3088e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 30916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) & 0xc0; \ 31016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, ScaleCharToQuantum( \ 31116ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 2) | (lbr_bits >> 4) | (lbr_bits >> 6))), \ 31216ea139d53d867211d3bb0fa859a83de653f687ecristy (pixel) ); \ 3138e58efdecda887b08ef730d68290a61081ef2566glennrp } 3148e58efdecda887b08ef730d68290a61081ef2566glennrp 31554cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR02PixelRGB(pixel) \ 316bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 317ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR02PixelRed((pixel)); \ 31854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelGreen((pixel)); \ 31954cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelBlue((pixel)); \ 320bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3218e58efdecda887b08ef730d68290a61081ef2566glennrp 32216ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR02PixelRGBA(pixel) \ 323bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 32454cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelRGB((pixel)); \ 32516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PixelAlpha((pixel)); \ 326bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3278e58efdecda887b08ef730d68290a61081ef2566glennrp 3288e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR03: Replicate top 3 bits (only used with opaque pixels during 3298e58efdecda887b08ef730d68290a61081ef2566glennrp PNG8 quantization) */ 3308e58efdecda887b08ef730d68290a61081ef2566glennrp 33105001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR03PacketRed(pixelpacket) \ 3328e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3338e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xe0; \ 3348e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum( \ 3358e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 3368e58efdecda887b08ef730d68290a61081ef2566glennrp } 33791d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketGreen(pixelpacket) \ 3388e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3398e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xe0; \ 3408e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum( \ 3418e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 3428e58efdecda887b08ef730d68290a61081ef2566glennrp } 34391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketBlue(pixelpacket) \ 3448e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3458e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xe0; \ 3468e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum( \ 3478e58efdecda887b08ef730d68290a61081ef2566glennrp (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))); \ 3488e58efdecda887b08ef730d68290a61081ef2566glennrp } 3498e58efdecda887b08ef730d68290a61081ef2566glennrp 35091d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR03PacketRGB(pixelpacket) \ 351bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 35205001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR03PacketRed((pixelpacket)); \ 35391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketGreen((pixelpacket)); \ 35491d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketBlue((pixelpacket)); \ 355bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3568e58efdecda887b08ef730d68290a61081ef2566glennrp 357ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR03PixelRed(pixel) \ 3588e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 35916ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 3608e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 36116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image, ScaleCharToQuantum( \ 36216ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3638e58efdecda887b08ef730d68290a61081ef2566glennrp } 36416ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03Green(pixel) \ 3658e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 36616ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 3678e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 36816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image, ScaleCharToQuantum( \ 36916ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3708e58efdecda887b08ef730d68290a61081ef2566glennrp } 37116ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03Blue(pixel) \ 3728e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 37316ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelBlue(image,(pixel))) \ 3748e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xe0; \ 37516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image, ScaleCharToQuantum( \ 37616ea139d53d867211d3bb0fa859a83de653f687ecristy (lbr_bits | (lbr_bits >> 3) | (lbr_bits >> 6))), (pixel)); \ 3778e58efdecda887b08ef730d68290a61081ef2566glennrp } 3788e58efdecda887b08ef730d68290a61081ef2566glennrp 37916ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR03RGB(pixel) \ 380bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 381ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR03PixelRed((pixel)); \ 38216ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03Green((pixel)); \ 38316ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03Blue((pixel)); \ 384bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 3858e58efdecda887b08ef730d68290a61081ef2566glennrp 3868e58efdecda887b08ef730d68290a61081ef2566glennrp/* LBR04: Replicate top 4 bits */ 3878e58efdecda887b08ef730d68290a61081ef2566glennrp 38805001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp#define LBR04PacketRed(pixelpacket) \ 3898e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3908e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).red) & 0xf0; \ 3918e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).red=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3928e58efdecda887b08ef730d68290a61081ef2566glennrp } 39391d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketGreen(pixelpacket) \ 3948e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 3958e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).green) & 0xf0; \ 3968e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).green=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 3978e58efdecda887b08ef730d68290a61081ef2566glennrp } 39891d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketBlue(pixelpacket) \ 3998e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4008e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).blue) & 0xf0; \ 4018e58efdecda887b08ef730d68290a61081ef2566glennrp (pixelpacket).blue=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 4028e58efdecda887b08ef730d68290a61081ef2566glennrp } 40316ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PacketAlpha(pixelpacket) \ 4048e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 40516ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar((pixelpacket).alpha) & 0xf0; \ 40616ea139d53d867211d3bb0fa859a83de653f687ecristy (pixelpacket).alpha=ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))); \ 4078e58efdecda887b08ef730d68290a61081ef2566glennrp } 4088e58efdecda887b08ef730d68290a61081ef2566glennrp 40991d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketRGB(pixelpacket) \ 410bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 41105001c3561dc5a341d5e0bfb88a6570bbdf359a1glennrp LBR04PacketRed((pixelpacket)); \ 41291d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketGreen((pixelpacket)); \ 41391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketBlue((pixelpacket)); \ 414bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4158e58efdecda887b08ef730d68290a61081ef2566glennrp 41691d99255dd77083750426ba5463e002a586bc9a6glennrp#define LBR04PacketRGBO(pixelpacket) \ 417bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 41891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB((pixelpacket)); \ 41916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PacketAlpha((pixelpacket)); \ 420bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4218e58efdecda887b08ef730d68290a61081ef2566glennrp 422ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy#define LBR04PixelRed(pixel) \ 4238e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 42416ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelRed(image,(pixel))) \ 4258e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xf0; \ 42616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,\ 42716ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 4288e58efdecda887b08ef730d68290a61081ef2566glennrp } 42954cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelGreen(pixel) \ 4308e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 43116ea139d53d867211d3bb0fa859a83de653f687ecristy unsigned char lbr_bits=ScaleQuantumToChar(GetPixelGreen(image,(pixel)))\ 4328e58efdecda887b08ef730d68290a61081ef2566glennrp & 0xf0; \ 43316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,\ 43416ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 4358e58efdecda887b08ef730d68290a61081ef2566glennrp } 43654cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelBlue(pixel) \ 4378e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4388e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 43916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,(pixel))) & 0xf0; \ 44016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,\ 44116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 4428e58efdecda887b08ef730d68290a61081ef2566glennrp } 44316ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PixelAlpha(pixel) \ 4448e58efdecda887b08ef730d68290a61081ef2566glennrp { \ 4458e58efdecda887b08ef730d68290a61081ef2566glennrp unsigned char lbr_bits= \ 44616ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelAlpha(image,(pixel))) & 0xf0; \ 44716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,\ 44816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((lbr_bits | (lbr_bits >> 4))), (pixel)); \ 4498e58efdecda887b08ef730d68290a61081ef2566glennrp } 4508e58efdecda887b08ef730d68290a61081ef2566glennrp 45154cf79782d2eba6612b706093f62474beb855c8dglennrp#define LBR04PixelRGB(pixel) \ 452bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 453ef61831f94757bbb7fd66e3f5d1aca8a19c0b58ecristy LBR04PixelRed((pixel)); \ 45454cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelGreen((pixel)); \ 45554cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelBlue((pixel)); \ 456bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4578e58efdecda887b08ef730d68290a61081ef2566glennrp 45816ea139d53d867211d3bb0fa859a83de653f687ecristy#define LBR04PixelRGBA(pixel) \ 459bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { \ 46054cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelRGB((pixel)); \ 46116ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PixelAlpha((pixel)); \ 462bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 4638e58efdecda887b08ef730d68290a61081ef2566glennrp 4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Establish thread safety. 4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is claimed to be safe on these platforms: 4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy setjmp/longjmp is alleged to be unsafe on these platforms: 4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 469868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef PNG_SETJMP_SUPPORTED 470868fff35aea4233c40dca33989293cb5bc91601aglennrp# ifndef IMPNG_SETJMP_IS_THREAD_SAFE 471868fff35aea4233c40dca33989293cb5bc91601aglennrp# define IMPNG_SETJMP_NOT_THREAD_SAFE 472868fff35aea4233c40dca33989293cb5bc91601aglennrp# endif 4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 474868fff35aea4233c40dca33989293cb5bc91601aglennrp# ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic SemaphoreInfo 476cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_semaphore = (SemaphoreInfo *) NULL; 477868fff35aea4233c40dca33989293cb5bc91601aglennrp# endif 4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This temporary until I set up malloc'ed object attributes array. 4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Recompile with MNG_MAX_OBJECTS=65536L to avoid this limit but 4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy waste more memory. 4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define MNG_MAX_OBJECTS 256 4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If this not defined, spec is interpreted strictly. If it is 4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined, an attempt will be made to recover from some errors, 4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy including 4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o global PLTE too short 4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef MNG_LOOSE 4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Don't try to define PNG_MNG_FEATURES_SUPPORTED here. Make sure 4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy it's defined in libpng/pngconf.h, version 1.0.9 or later. It won't work 4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy with earlier versions of libpng. From libpng-1.0.3a to libpng-1.0.8, 4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_READ|WRITE_EMPTY_PLTE were used but those have been deprecated in 5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy libpng in favor of PNG_MNG_FEATURES_SUPPORTED, so we set them here. 5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_MNG_FEATURES_SUPPORTED is disabled by default in libpng-1.0.9 and 5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy will be enabled by default in libpng-1.2.0. 5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_MNG_FEATURES_SUPPORTED 5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_READ_EMPTY_PLTE_SUPPORTED 5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifndef PNG_WRITE_EMPTY_PLTE_SUPPORTED 5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# define PNG_WRITE_EMPTY_PLTE_SUPPORTED 5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 514bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Maximum valid size_t in PNG/MNG chunks is (2^31)-1 5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This macro is only defined in libpng-1.0.3 and later. 5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Previously it was PNG_MAX_UINT but that was deprecated in libpng-1.2.6 5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_UINT_31_MAX 5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_UINT_31_MAX (png_uint_32) 0x7fffffffL 5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 5233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Constant strings for known chunk types. If you need to add a chunk, 5243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy add a string holding the name here. To make the code more 5253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy portable, we use ASCII numbers like this, not characters. 5263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 5273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 528629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_MHDR[5]={ 77, 72, 68, 82, (png_byte) '\0'}; 529629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_BACK[5]={ 66, 65, 67, 75, (png_byte) '\0'}; 530629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_BASI[5]={ 66, 65, 83, 73, (png_byte) '\0'}; 531629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_CLIP[5]={ 67, 76, 73, 80, (png_byte) '\0'}; 532629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_CLON[5]={ 67, 76, 79, 78, (png_byte) '\0'}; 533629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_DEFI[5]={ 68, 69, 70, 73, (png_byte) '\0'}; 534629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_DHDR[5]={ 68, 72, 68, 82, (png_byte) '\0'}; 535629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_DISC[5]={ 68, 73, 83, 67, (png_byte) '\0'}; 536629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_ENDL[5]={ 69, 78, 68, 76, (png_byte) '\0'}; 537629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_FRAM[5]={ 70, 82, 65, 77, (png_byte) '\0'}; 538629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_IEND[5]={ 73, 69, 78, 68, (png_byte) '\0'}; 539629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_IHDR[5]={ 73, 72, 68, 82, (png_byte) '\0'}; 540629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_JHDR[5]={ 74, 72, 68, 82, (png_byte) '\0'}; 541629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_LOOP[5]={ 76, 79, 79, 80, (png_byte) '\0'}; 542629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_MAGN[5]={ 77, 65, 71, 78, (png_byte) '\0'}; 543629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_MEND[5]={ 77, 69, 78, 68, (png_byte) '\0'}; 544629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_MOVE[5]={ 77, 79, 86, 69, (png_byte) '\0'}; 545629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_PAST[5]={ 80, 65, 83, 84, (png_byte) '\0'}; 546629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_PLTE[5]={ 80, 76, 84, 69, (png_byte) '\0'}; 547629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_SAVE[5]={ 83, 65, 86, 69, (png_byte) '\0'}; 548629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_SEEK[5]={ 83, 69, 69, 75, (png_byte) '\0'}; 549629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_SHOW[5]={ 83, 72, 79, 87, (png_byte) '\0'}; 550629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_TERM[5]={ 84, 69, 82, 77, (png_byte) '\0'}; 551629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_bKGD[5]={ 98, 75, 71, 68, (png_byte) '\0'}; 552629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_cHRM[5]={ 99, 72, 82, 77, (png_byte) '\0'}; 553629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_gAMA[5]={103, 65, 77, 65, (png_byte) '\0'}; 554629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_iCCP[5]={105, 67, 67, 80, (png_byte) '\0'}; 555629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_nEED[5]={110, 69, 69, 68, (png_byte) '\0'}; 556629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_pHYg[5]={112, 72, 89, 103, (png_byte) '\0'}; 557629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_vpAg[5]={118, 112, 65, 103, (png_byte) '\0'}; 558629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_pHYs[5]={112, 72, 89, 115, (png_byte) '\0'}; 559629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_sBIT[5]={115, 66, 73, 84, (png_byte) '\0'}; 560629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_sRGB[5]={115, 82, 71, 66, (png_byte) '\0'}; 561629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_tRNS[5]={116, 82, 78, 83, (png_byte) '\0'}; 5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 564629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_IDAT[5]={ 73, 68, 65, 84, (png_byte) '\0'}; 565629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_JDAT[5]={ 74, 68, 65, 84, (png_byte) '\0'}; 566629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_JDAA[5]={ 74, 68, 65, 65, (png_byte) '\0'}; 567629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_JdAA[5]={ 74, 100, 65, 65, (png_byte) '\0'}; 568629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_JSEP[5]={ 74, 83, 69, 80, (png_byte) '\0'}; 569629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_oFFs[5]={111, 70, 70, 115, (png_byte) '\0'}; 5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 572689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#if 0 573689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp/* Other known chunks that are not yet supported by ImageMagick: */ 574629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_hIST[5]={104, 73, 83, 84, (png_byte) '\0'}; 575629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_iTXt[5]={105, 84, 88, 116, (png_byte) '\0'}; 576629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_sPLT[5]={115, 80, 76, 84, (png_byte) '\0'}; 577629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_sTER[5]={115, 84, 69, 82, (png_byte) '\0'}; 578629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_tEXt[5]={116, 69, 88, 116, (png_byte) '\0'}; 579629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_tIME[5]={116, 73, 77, 69, (png_byte) '\0'}; 580629f80558ba1e82b0317a3d778deaf195c8e37e5Cristystatic const png_byte mng_zTXt[5]={122, 84, 88, 116, (png_byte) '\0'}; 581689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#endif 5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBox 5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5858182b0758e3429fb8dcd1700f09643fd4d80a41ccristy long 5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy left, 5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy right, 5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy top, 5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bottom; 5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBox; 5913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5923ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngPair 5933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 5948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy volatile long 5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a, 5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy b; 5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngPair; 5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngBuffer 6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 603bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy height, 6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy width; 6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color 6113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte[256]; 6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reference_count; 6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_sample_depth, 6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression_method, 6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_type, 6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy concrete, 6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy filter_method, 6223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen, 6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_type, 6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy interlace_method, 6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixel_sample_depth, 6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte_length, 6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sample_depth, 6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable; 6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngBuffer; 6303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _MngInfo 6333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 6343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 6363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBuffer 6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ob[MNG_MAX_OBJECTS]; 6383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image * 6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image; 6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy page; 6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy adjoin, 6483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 6493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy bytes_in_read_buffer, 6503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy found_empty_plte, 6513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_backgrounds, 6533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_chrms, 6543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_gammas, 6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 6563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 6573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_palettes, 6583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_physs, 6603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy equal_srgbs, 6613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode, 6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_bkgd, 6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_chrm, 6643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_gama, 6653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_phys, 6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_sbit, 6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_global_srgb, 6683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_saved_bkgd_index, 6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_chrm, 6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_gama, 6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_plte, 6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_write_global_srgb, 6733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_fram, 6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_framing_mode, 6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy saved_bkgd_index; 6773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 6793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy new_number_colors; 6803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 681bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 6823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_found, 6833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_count[256], 6843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_iteration[256], 6853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scenes_found, 6863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x_off[MNG_MAX_OBJECTS], 6873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y_off[MNG_MAX_OBJECTS]; 6883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clip, 6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame, 6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_box, 6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_clip[MNG_MAX_OBJECTS]; 6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 6963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* These flags could be combined into one byte */ 6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exists[MNG_MAX_OBJECTS], 6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frozen[MNG_MAX_OBJECTS], 6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_active[256], 7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy invisible[MNG_MAX_OBJECTS], 7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy viewable[MNG_MAX_OBJECTS]; 7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_jump[256]; 7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte; 7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_8 7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_sbit; 7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_buffer[8], 7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns[256]; 7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy float 7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_gamma; 7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ChromaticityInfo 7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_chrm; 7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RenderingIntent 7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_srgb_intent; 7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72735ef824baa82511126ff0072ae30eee0da9c05a3cristy unsigned int 7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy delay, 7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_plte_length, 7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_trns_length, 7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_x_pixels_per_unit, 7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_y_pixels_per_unit, 7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_width, 7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_height, 7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ticks_per_second; 7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 737b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp MagickBooleanType 738b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp need_blob; 739b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy IsPalette, 7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy global_phys_unit_type, 7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_warning, 7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy clon_warning, 7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dhdr_warning, 7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jhdr_warning, 7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_warning, 7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy past_warning, 7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phyg_warning, 7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy phys_warning, 7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sbit_warning, 7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy show_warning, 7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type, 7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng, 7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_colortype, 7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png_depth, 7571868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_level, 7581868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_strategy, 7591868258559ddf946fa73ef72dd43507b32623705glennrp write_png_compression_filter, 7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png8, 7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_png24, 762fd164d2bf84b111e304959af5698757d60e9b8aeglennrp write_png32, 763fd164d2bf84b111e304959af5698757d60e9b8aeglennrp write_png48, 764fd164d2bf84b111e304959af5698757d60e9b8aeglennrp write_png64; 7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 767bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_width, 7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_height; 7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_depth, 7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type, 7743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method, 7753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type, 7763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method, 7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red, 7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green, 7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue, 7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha, 7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable; 7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 7863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 7873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 7883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79616ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_global_bkgd; 7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* Added at version 6.6.6-7 */ 80026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp MagickBooleanType 80126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_bKGD, 80226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_cHRM, 803a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date, 80426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_EXIF, 80526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_gAMA, 80626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_iCCP, 80726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* ping_exclude_iTXt, */ 80826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_oFFs, 80926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_pHYs, 81026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_sRGB, 81126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_tEXt, 812a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp ping_exclude_tRNS, 81326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_vpAg, 81426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zCCP, /* hex-encoded iCCP */ 8158d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_exclude_zTXt, 816ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_colormap, 817ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* Added at version 6.8.5-7 */ 818fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_preserve_iCCP, 819fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk /* Added at version 6.8.9-9 */ 820fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_exclude_tIME; 82126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} MngInfo; 8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* VER */ 8243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Forward declarations. 8273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 82916ea139d53d867211d3bb0fa859a83de653f687ecristy WritePNGImage(const ImageInfo *,Image *,ExceptionInfo *); 8300c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 83216ea139d53d867211d3bb0fa859a83de653f687ecristy WriteMNGImage(const ImageInfo *,Image *,ExceptionInfo *); 8330c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType 83616ea139d53d867211d3bb0fa859a83de653f687ecristy WriteJNGImage(const ImageInfo *,Image *,ExceptionInfo *); 8373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8390c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#if PNG_LIBPNG_VER > 10011 8400c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 841fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8420c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#if (MAGICKCORE_QUANTUM_DEPTH >= 16) 8430c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrpstatic MagickBooleanType 84416ea139d53d867211d3bb0fa859a83de653f687ecristyLosslessReduceDepthOK(Image *image,ExceptionInfo *exception) 8450c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp{ 8469d0ea4d0d750fa124d7b83da98ed582d59c1aab0glennrp /* Reduce bit depth if it can be reduced losslessly from 16+ to 8. 84767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * 84867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * This is true if the high byte and the next highest byte of 84967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * each sample of the image, the colormap, and the background color 8503faa9a3fb01696daaf976d595f492cb530bffb21glennrp * are equal to each other. We check this by seeing if the samples 8513faa9a3fb01696daaf976d595f492cb530bffb21glennrp * are unchanged when we scale them down to 8 and back up to Quantum. 85267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * 85367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * We don't use the method GetImageDepth() because it doesn't check 8543faa9a3fb01696daaf976d595f492cb530bffb21glennrp * background and doesn't handle PseudoClass specially. 8559d0ea4d0d750fa124d7b83da98ed582d59c1aab0glennrp */ 85605a549971fd661147ade177e2bc10f6cfcfc32b4glennrp 8573faa9a3fb01696daaf976d595f492cb530bffb21glennrp#define QuantumToCharToQuantumEqQuantum(quantum) \ 8583faa9a3fb01696daaf976d595f492cb530bffb21glennrp ((ScaleCharToQuantum((unsigned char) ScaleQuantumToChar(quantum))) == quantum) 8593faa9a3fb01696daaf976d595f492cb530bffb21glennrp 86067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp MagickBooleanType 86167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp ok_to_reduce=MagickFalse; 86267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp 86303e11f6e8d7f01a32b53d7e8e6a3bfd5ef1c5c9dglennrp if (image->depth >= 16) 8640c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 8650c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 86616ea139d53d867211d3bb0fa859a83de653f687ecristy const Quantum 8670c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp *p; 8680c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8690c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ok_to_reduce= 8703faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.red) && 8713faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.green) && 8723faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum(image->background_color.blue) ? 8733faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 8740c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8750c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce != MagickFalse && image->storage_class == PseudoClass) 8760c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 8770c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp int indx; 8780c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8790c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (indx=0; indx < (ssize_t) image->colors; indx++) 8800c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 8813faa9a3fb01696daaf976d595f492cb530bffb21glennrp ok_to_reduce=( 8823faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 8833faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].red) && 8843faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 8853faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].green) && 8863faa9a3fb01696daaf976d595f492cb530bffb21glennrp QuantumToCharToQuantumEqQuantum( 8873faa9a3fb01696daaf976d595f492cb530bffb21glennrp image->colormap[indx].blue)) ? 8883faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 8893faa9a3fb01696daaf976d595f492cb530bffb21glennrp 8900c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce == MagickFalse) 8913faa9a3fb01696daaf976d595f492cb530bffb21glennrp break; 8920c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 8930c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 8940c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 8950c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if ((ok_to_reduce != MagickFalse) && 8960c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp (image->storage_class != PseudoClass)) 8970c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 8980c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ssize_t 8990c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp y; 9000c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9010c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp register ssize_t 9020c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp x; 9030c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9040c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (y=0; y < (ssize_t) image->rows; y++) 9050c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 90616ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 9070c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 90816ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 9090c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9100c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp ok_to_reduce = MagickFalse; 9110c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 9120c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 9130c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9140c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 9150c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9163faa9a3fb01696daaf976d595f492cb530bffb21glennrp ok_to_reduce= 91716ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelRed(image,p)) && 91816ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelGreen(image,p)) && 91916ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumToCharToQuantumEqQuantum(GetPixelBlue(image,p)) ? 9203faa9a3fb01696daaf976d595f492cb530bffb21glennrp MagickTrue : MagickFalse; 9210c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9220c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce == MagickFalse) 9230c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 9240c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 92516ea139d53d867211d3bb0fa859a83de653f687ecristy p+=GetPixelChannels(image); 9260c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 9278640fb5e9b1094f35f8beab436f81661b8a99448glennrp if (x >= 0) 9280c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp break; 9290c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 9300c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 9310c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9320c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp if (ok_to_reduce != MagickFalse) 9330c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp { 9340c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 935fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " OK to reduce PNG bit depth to 8 without loss of info"); 9360c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 937a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp else 938a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp { 939a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 940fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Not OK to reduce PNG bit depth to 8 without loss of info"); 941a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp } 9420c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp } 9430c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9440c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp return ok_to_reduce; 9450c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp} 9460c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp#endif /* MAGICKCORE_QUANTUM_DEPTH >= 16 */ 9470c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp 9481a56e9c9268976936eeab9fe97eb664b847e444cglennrpstatic const char* PngColorTypeToString(const unsigned int color_type) 9491a56e9c9268976936eeab9fe97eb664b847e444cglennrp{ 9501a56e9c9268976936eeab9fe97eb664b847e444cglennrp const char 9511a56e9c9268976936eeab9fe97eb664b847e444cglennrp *result = "Unknown"; 9521a56e9c9268976936eeab9fe97eb664b847e444cglennrp 9531a56e9c9268976936eeab9fe97eb664b847e444cglennrp switch (color_type) 9541a56e9c9268976936eeab9fe97eb664b847e444cglennrp { 9551a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_GRAY: 9561a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Gray"; 9571a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 9581a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 9591a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Gray+Alpha"; 9601a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 9611a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_PALETTE: 9621a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "Palette"; 9631a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 9641a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_RGB: 9651a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "RGB"; 9661a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 9671a56e9c9268976936eeab9fe97eb664b847e444cglennrp case PNG_COLOR_TYPE_RGB_ALPHA: 9681a56e9c9268976936eeab9fe97eb664b847e444cglennrp result = "RGB+Alpha"; 9691a56e9c9268976936eeab9fe97eb664b847e444cglennrp break; 9701a56e9c9268976936eeab9fe97eb664b847e444cglennrp } 9711a56e9c9268976936eeab9fe97eb664b847e444cglennrp 9721a56e9c9268976936eeab9fe97eb664b847e444cglennrp return result; 9731a56e9c9268976936eeab9fe97eb664b847e444cglennrp} 9741a56e9c9268976936eeab9fe97eb664b847e444cglennrp 975e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic int 976cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_RenderingIntent_to_PNG_RenderingIntent(const RenderingIntent intent) 9770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp{ 978e610a071534e448c46460a5aa39ede33bf56b329glennrp switch (intent) 979e610a071534e448c46460a5aa39ede33bf56b329glennrp { 980e610a071534e448c46460a5aa39ede33bf56b329glennrp case PerceptualIntent: 981e610a071534e448c46460a5aa39ede33bf56b329glennrp return 0; 9820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 983e610a071534e448c46460a5aa39ede33bf56b329glennrp case RelativeIntent: 984e610a071534e448c46460a5aa39ede33bf56b329glennrp return 1; 9850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 986e610a071534e448c46460a5aa39ede33bf56b329glennrp case SaturationIntent: 987e610a071534e448c46460a5aa39ede33bf56b329glennrp return 2; 9880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 989e610a071534e448c46460a5aa39ede33bf56b329glennrp case AbsoluteIntent: 990e610a071534e448c46460a5aa39ede33bf56b329glennrp return 3; 9910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 992e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 993e610a071534e448c46460a5aa39ede33bf56b329glennrp return -1; 994e610a071534e448c46460a5aa39ede33bf56b329glennrp } 995e610a071534e448c46460a5aa39ede33bf56b329glennrp} 996e610a071534e448c46460a5aa39ede33bf56b329glennrp 997e610a071534e448c46460a5aa39ede33bf56b329glennrpstatic RenderingIntent 998cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_RenderingIntent_from_PNG_RenderingIntent(const int ping_intent) 9990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp{ 1000cf002022280cc4dedb2748ad6f415aac1d44f530glennrp switch (ping_intent) 1001e610a071534e448c46460a5aa39ede33bf56b329glennrp { 1002e610a071534e448c46460a5aa39ede33bf56b329glennrp case 0: 1003e610a071534e448c46460a5aa39ede33bf56b329glennrp return PerceptualIntent; 10040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1005e610a071534e448c46460a5aa39ede33bf56b329glennrp case 1: 1006e610a071534e448c46460a5aa39ede33bf56b329glennrp return RelativeIntent; 10070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1008e610a071534e448c46460a5aa39ede33bf56b329glennrp case 2: 1009e610a071534e448c46460a5aa39ede33bf56b329glennrp return SaturationIntent; 10100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1011e610a071534e448c46460a5aa39ede33bf56b329glennrp case 3: 1012e610a071534e448c46460a5aa39ede33bf56b329glennrp return AbsoluteIntent; 10130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1014e610a071534e448c46460a5aa39ede33bf56b329glennrp default: 1015e610a071534e448c46460a5aa39ede33bf56b329glennrp return UndefinedIntent; 1016e610a071534e448c46460a5aa39ede33bf56b329glennrp } 1017e610a071534e448c46460a5aa39ede33bf56b329glennrp} 1018e610a071534e448c46460a5aa39ede33bf56b329glennrp 10199d8c12213abd15fee2d84da62d3e5145d9db06cdcristystatic const char * 102098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrpMagick_RenderingIntentString_from_PNG_RenderingIntent(const int ping_intent) 102198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp{ 102298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp switch (ping_intent) 102398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 102498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp case 0: 102598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp return "Perceptual Intent"; 102698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 102798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp case 1: 102898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp return "Relative Intent"; 102998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 103098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp case 2: 103198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp return "Saturation Intent"; 103298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 103398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp case 3: 103498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp return "Absolute Intent"; 103598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 103698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp default: 103798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp return "Undefined Intent"; 103898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 103998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp} 104098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 1041d9ecd04e9c567113b4b605cf76681cbb37c093cdcristystatic const char * 10425dff435eceea4f80207a906b11e65aed48fe3f27glennrpMagick_ColorType_from_PNG_ColorType(const int ping_colortype) 10435dff435eceea4f80207a906b11e65aed48fe3f27glennrp{ 10445dff435eceea4f80207a906b11e65aed48fe3f27glennrp switch (ping_colortype) 10455dff435eceea4f80207a906b11e65aed48fe3f27glennrp { 10465dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 0: 10475dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Grayscale"; 10485dff435eceea4f80207a906b11e65aed48fe3f27glennrp 10495dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 2: 10505dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Truecolor"; 10515dff435eceea4f80207a906b11e65aed48fe3f27glennrp 10525dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 3: 10535dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "Indexed"; 10545dff435eceea4f80207a906b11e65aed48fe3f27glennrp 10555dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 4: 10565dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "GrayAlpha"; 10575dff435eceea4f80207a906b11e65aed48fe3f27glennrp 10585dff435eceea4f80207a906b11e65aed48fe3f27glennrp case 6: 10595dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "RGBA"; 10605dff435eceea4f80207a906b11e65aed48fe3f27glennrp 10615dff435eceea4f80207a906b11e65aed48fe3f27glennrp default: 10625dff435eceea4f80207a906b11e65aed48fe3f27glennrp return "UndefinedColorType"; 10635dff435eceea4f80207a906b11e65aed48fe3f27glennrp } 10645dff435eceea4f80207a906b11e65aed48fe3f27glennrp} 10655dff435eceea4f80207a906b11e65aed48fe3f27glennrp 1066d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MAGICKCORE_PNG_DELEGATE */ 10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s M N G % 10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsMNG() returns MagickTrue if the image format type, identified by the 10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is MNG. 10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsMNG method is: 10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsMNG(const unsigned char *magick,const size_t length) 10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 10990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\212MNG\r\n\032\n",8) == 0) 11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 11020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s J N G % 11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsJNG() returns MagickTrue if the image format type, identified by the 11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is JNG. 11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsJNG method is: 11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 11233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 11273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsJNG(const unsigned char *magick,const size_t length) 11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 11360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\213JNG\r\n\032\n",8) == 0) 11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 11390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% I s P N G % 11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% IsPNG() returns MagickTrue if the image format type, identified by the 11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% magick string, is PNG. 11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the IsPNG method is: 11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o magick: compare image format pattern against these bytes. 11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o length: Specifies the length of the magick string. 11663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType IsPNG(const unsigned char *magick,const size_t length) 11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 11720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magick,"\211PNG\r\n\032\n",8) == 0) 11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 11750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 11833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1184d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER > 10011) 1185bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristystatic size_t WriteBlobMSBULong(Image *image,const size_t value) 11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 11883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[4]; 11893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 1191e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 11923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[0]=(unsigned char) (value >> 24); 11933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[1]=(unsigned char) (value >> 16); 11943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[2]=(unsigned char) (value >> 8); 11953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy buffer[3]=(unsigned char) value; 11963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((size_t) WriteBlob(image,4,buffer)); 11973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 11983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11993ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGLong(png_bytep p,png_uint_32 value) 12003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 12023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 12033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 12043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 12053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1207a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp#if defined(JNG_SUPPORTED) 12083ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGsLong(png_bytep p,png_int_32 value) 12093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 24) & 0xff); 12113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 16) & 0xff); 12123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 12133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 12143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1215a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp#endif 12163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12173ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void PNGShort(png_bytep p,png_uint_16 value) 12183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) ((value >> 8) & 0xff); 12203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p++=(png_byte) (value & 0xff); 12213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1223120b581ad9516a43c50caedfa1a8cff418488819Cristystatic void PNGType(png_bytep p,const png_byte *type) 12243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(p,type,4*sizeof(png_byte)); 12263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1228120b581ad9516a43c50caedfa1a8cff418488819Cristystatic void LogPNGChunk(MagickBooleanType logging, const png_byte *type, 122903812ae402fb53d548f0e1d7d14720768f803c2dglennrp size_t length) 12303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 12313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 12323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1233e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Writing %c%c%c%c chunk, length: %.20g", 1234e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 12353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1236d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 12373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 12393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 12403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 12413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1242d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if PNG_LIBPNG_VER > 10011 12433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 12443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d P N G I m a g e % 12493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 12523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 12533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadPNGImage() reads a Portable Network Graphics (PNG) or 12553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file and returns it. It 12563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% allocates the memory necessary for the new Image structure and returns a 12573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% pointer to the new image or set of images. 12583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 12603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadPNGImage method is: 12623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 12643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 12663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 12683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 12703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do, more or less in chronological order (as of version 5.5.2, 12723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% November 26, 2002 -- glennrp -- see also "To do" under WriteMNGImage): 12733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Get 16-bit cheap transparency working. 12753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG decoding is supposed to be in full MNG-LC compliance) 12773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 12793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 12803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 12813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (At this point, PNG encoding should be in full MNG compliance) 12833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide options for choice of background to use when the MNG BACK 12853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk is not present or is not mandatory (i.e., leave transparent, 12863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% user specified, MNG BACK, PNG bKGD) 12873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Implement LOOP/ENDL [done, but could do discretionary loops more 12893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% efficiently by linking in the duplicate frames.]. 12903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Decode and act on the MHDR simplicity profile (offer option to reject 12923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files or attempt to process them anyway when the profile isn't LC or VLC). 12933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG without Delta-PNG. 12953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 12963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BACK [done a while ago except for background image ID] 12973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MOVE [done 15 May 1999] 12983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o CLIP [done 15 May 1999] 12993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o DISC [done 19 May 1999] 13003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SAVE [partially done 19 May 1999 (marks objects frozen)] 13013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SEEK [partially done 19 May 1999 (discard function only)] 13023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o SHOW 13033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PAST 13043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o BASI 13053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o MNG-level tEXt/iTXt/zTXt 13063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYg 13073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o pHYs 13083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o sBIT 13093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o bKGD 13103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o iTXt (wait for libpng implementation). 13113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use the scene signature to discover when an identical scene is 13133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% being reused, and just point to the original image->exception instead 13143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of storing another set of pixels. This not specific to MNG 13153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% but could be applied generally. 13163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Upgrade to full MNG with Delta-PNG. 13183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG tEXt/iTXt/zTXt 13203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 13213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% We will not attempt to read files containing the CgBI chunk. 13223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% They are really Xcode files meant for display on the iPhone. 13233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% These are not valid PNG files and it is impossible to recover 1324f54e295d6fa414fa04aa4f43767c20eda8ae555eglennrp% the original PNG from files that have been converted to Xcode-PNG, 13253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% since irretrievable loss of color data has occurred due to the 13263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% use of premultiplied alpha. 13273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 13283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 13303ed852eea50f9d4cd633efb8c2b054b8e33c253cristyextern "C" { 13313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 13343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy This the function that does the actual reading of data. It is 13353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the same as the one supplied in libpng, except that it receives the 13363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy datastream from the ReadBlob() function instead of standard input. 13373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 13383ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 13393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 13413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 13423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 13448fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 13453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 13473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 13483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,data); 13503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 13513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 1353151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy msg[MagickPathExtent]; 13543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1355151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 1356e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "Expected %.20g bytes; found %.20g bytes",(double) length, 1357e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) check); 13583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_warning(png_ptr,msg); 13593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 13603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(PNG_READ_EMPTY_PLTE_SUPPORTED) && \ 13653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy !defined(PNG_MNG_FEATURES_SUPPORTED) 13663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* We use mng_get_data() instead of png_get_data() if we have a libpng 13673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * older than libpng-1.0.3a, which was the first to allow the empty 13683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * PLTE, or a newer libpng in which PNG_MNG_FEATURES_SUPPORTED was 13693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * ifdef'ed out. Earlier versions would crash if the bKGD chunk was 13703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * encountered after an empty PLTE, so we have to look ahead for bKGD 13713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * chunks and remove them from the datastream that is passed to libpng, 13723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * and store their contents for later use. 13733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 13743ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void mng_get_data(png_structp png_ptr,png_bytep data,png_size_t length) 13753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 13763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 13773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 13783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 13803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 13813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 13833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 13843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1385bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 13863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 13873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i=0; 13893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) png_get_io_ptr(png_ptr); 13903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) mng_info->image; 13913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (mng_info->bytes_in_read_buffer && length) 13923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[i]=mng_info->read_buffer[i]; 13943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer--; 13953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length--; 13963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i++; 13973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 13988fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 13993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length,(char *) data); 14010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 14033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"Read Exception"); 14040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 14063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 14083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 0)) 14093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 14113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 14123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 14133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 14143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_PLTE,4) == 0) 14153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickTrue; 14163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_IEND,4) == 0) 14173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 14193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 14203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((data[0] == 0) && (data[1] == 0) && (data[2] == 0) && 14243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (data[3] == 1)) 14253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 14273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 14283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->read_buffer[4]=0; 14293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=4; 14303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(mng_info->read_buffer,mng_bKGD,4) == 0) 14313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->found_empty_plte) 14323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 14343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Skip the bKGD data byte and CRC. 14353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 14363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) 14373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ReadBlob(image,5,(char *) mng_info->read_buffer); 14383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check=(png_size_t) ReadBlob(image,(size_t) length, 14393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (char *) mng_info->read_buffer); 14403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->saved_bkgd_index=mng_info->read_buffer[0]; 14413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickTrue; 14423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 14433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 14493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14503ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_put_data(png_structp png_ptr,png_bytep data,png_size_t length) 14513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 14533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 14543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_io_ptr(png_ptr); 14568fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 14573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t 14593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check; 14603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1461bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy check=(png_size_t) WriteBlob(image,(size_t) length,data); 14620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (check != length) 14643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(png_ptr,"WriteBlob Failed"); 14653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14683ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void png_flush_data(png_structp png_ptr) 14693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 14703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_ptr; 14713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 14743ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int PalettesAreEqual(Image *a,Image *b) 14753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1476bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 14773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 14783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 14793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a == (Image *) NULL) || (b == (Image *) NULL)) 14803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 14810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->storage_class != PseudoClass || b->storage_class != PseudoClass) 14833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 14840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (a->colors != b->colors) 14863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 14870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1488bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) a->colors; i++) 14893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 14903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((a->colormap[i].red != b->colormap[i].red) || 14913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].green != b->colormap[i].green) || 14923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (a->colormap[i].blue != b->colormap[i].blue)) 14933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickFalse); 14943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 14950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 14963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((int) MagickTrue); 14973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 14983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 14993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15003ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void MngInfoDiscardObject(MngInfo *mng_info,int i) 15013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i && (i < MNG_MAX_OBJECTS) && (mng_info != (MngInfo *) NULL) && 15033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i] && !mng_info->frozen[i]) 15043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 15063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 15073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count > 0) 15093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->reference_count--; 15100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->reference_count == 0) 15123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i]->image != (Image *) NULL) 15143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->image=DestroyImage(mng_info->ob[i]->image); 15150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=DestroyString(mng_info->ob[i]); 15173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]=(MngBuffer *) NULL; 15203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 15213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[i]=MagickFalse; 15223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[i]=MagickFalse; 15233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[i]=MagickFalse; 15243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickFalse; 15253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->x_off[i]=0; 15263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->y_off[i]=0; 15273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].left=0; 1528bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 15293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i].top=0; 1530bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 15313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 153421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrpstatic void MngInfoFreeStruct(MngInfo *mng_info, 153521f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp MagickBooleanType *have_mng_structure) 15363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 153721f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp if (*have_mng_structure != MagickFalse && (mng_info != (MngInfo *) NULL)) 15383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1539bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 15403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 15413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 15433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 15440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte != (png_colorp) NULL) 15463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) 15473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RelinquishMagickMemory(mng_info->global_plte); 15480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) RelinquishMagickMemory(mng_info); 15503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *have_mng_structure=MagickFalse; 15513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15543ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_minimum_box(MngBox box1,MngBox box2) 15553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 15573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 15583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box=box1; 15603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.left < box2.left) 15613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left=box2.left; 15620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.top < box2.top) 15643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top=box2.top; 15650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.right > box2.right) 15673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right=box2.right; 15680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (box.bottom > box2.bottom) 15703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom=box2.bottom; 15710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return box; 15733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngBox mng_read_box(MngBox previous_box,char delta_type,unsigned char *p) 15763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 15773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 15783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box; 15793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 15813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read clipping boundaries from DEFI, CLIP, FRAM, or PAST chunk. 15823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1583bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.left=(ssize_t) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 1584bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.right=(ssize_t) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 1585bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.top=(ssize_t) ((p[8] << 24) | (p[9] << 16) | (p[10] << 8) | p[11]); 1586bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy box.bottom=(ssize_t) ((p[12] << 24) | (p[13] << 16) | (p[14] << 8) | p[15]); 15873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 15883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 15893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.left+=previous_box.left; 15903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.right+=previous_box.right; 15913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.top+=previous_box.top; 15923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy box.bottom+=previous_box.bottom; 15933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 15940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 15953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(box); 15963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 15973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 15983ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MngPair mng_read_pair(MngPair previous_pair,int delta_type, 15993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char *p) 16003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngPair 16023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair; 16033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 1604bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy Read two ssize_ts from CLON, MOVE or PAST chunk 16053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 16068182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.a=(long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3]); 16078182b0758e3429fb8dcd1700f09643fd4d80a41ccristy pair.b=(long) ((p[4] << 24) | (p[5] << 16) | (p[6] << 8) | p[7]); 16080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (delta_type != 0) 16103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 16113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.a+=previous_pair.a; 16123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pair.b+=previous_pair.b; 16133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 16140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 16153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(pair); 16163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16188182b0758e3429fb8dcd1700f09643fd4d80a41ccristystatic long mng_get_long(unsigned char *p) 16193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 16208182b0758e3429fb8dcd1700f09643fd4d80a41ccristy return((long) ((p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3])); 16213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 162316ea139d53d867211d3bb0fa859a83de653f687ecristytypedef struct _PNGErrorInfo 162416ea139d53d867211d3bb0fa859a83de653f687ecristy{ 162516ea139d53d867211d3bb0fa859a83de653f687ecristy Image 162616ea139d53d867211d3bb0fa859a83de653f687ecristy *image; 162716ea139d53d867211d3bb0fa859a83de653f687ecristy 162816ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 162916ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 163016ea139d53d867211d3bb0fa859a83de653f687ecristy} PNGErrorInfo; 163116ea139d53d867211d3bb0fa859a83de653f687ecristy 1632cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic void MagickPNGErrorHandler(png_struct *ping,png_const_charp message) 16333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 163416ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 163516ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 163616ea139d53d867211d3bb0fa859a83de653f687ecristy 16373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 16383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 16393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 164016ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 164116ea139d53d867211d3bb0fa859a83de653f687ecristy *error_info; 16420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 164316ea139d53d867211d3bb0fa859a83de653f687ecristy error_info=(PNGErrorInfo *) png_get_error_ptr(ping); 164416ea139d53d867211d3bb0fa859a83de653f687ecristy image=error_info->image; 164516ea139d53d867211d3bb0fa859a83de653f687ecristy exception=error_info->exception; 1646c82a27bb8e3138ff9bbf0f696663bdf3e704cedecristy 164716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1648b989d32f1a878692144c3b76764f931575f22131glennrp " libpng-%s error: %s", png_get_libpng_ver(NULL),message); 164916ea139d53d867211d3bb0fa859a83de653f687ecristy 165016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError,message, 165116ea139d53d867211d3bb0fa859a83de653f687ecristy "`%s'",image->filename); 16520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1653e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 16548371ecc013ff231ce380d8717e517312e62e1f01glennrp /* A warning about deprecated use of jmpbuf here is unavoidable if you 16558371ecc013ff231ce380d8717e517312e62e1f01glennrp * are building with libpng-1.4.x and can be ignored. 16568371ecc013ff231ce380d8717e517312e62e1f01glennrp */ 16573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy longjmp(ping->jmpbuf,1); 1658faa852bad40107edae19405e76a299057668d795glennrp#else 1659faa852bad40107edae19405e76a299057668d795glennrp png_longjmp(ping,1); 1660faa852bad40107edae19405e76a299057668d795glennrp#endif 16613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1663cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic void MagickPNGWarningHandler(png_struct *ping,png_const_charp message) 16643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 166516ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo 166616ea139d53d867211d3bb0fa859a83de653f687ecristy *exception; 166716ea139d53d867211d3bb0fa859a83de653f687ecristy 16683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 16693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 16703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 167116ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 167216ea139d53d867211d3bb0fa859a83de653f687ecristy *error_info; 167316ea139d53d867211d3bb0fa859a83de653f687ecristy 16743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(message, "Missing PLTE before tRNS") == 0) 16753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping, message); 16760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 167716ea139d53d867211d3bb0fa859a83de653f687ecristy error_info=(PNGErrorInfo *) png_get_error_ptr(ping); 167816ea139d53d867211d3bb0fa859a83de653f687ecristy image=error_info->image; 167916ea139d53d867211d3bb0fa859a83de653f687ecristy exception=error_info->exception; 168016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1681b989d32f1a878692144c3b76764f931575f22131glennrp " libpng-%s warning: %s", png_get_libpng_ver(NULL),message); 16820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 168316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderWarning, 16843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy message,"`%s'",image->filename); 16853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 1688943b7d3decdd71b57fba7c2fe73fa26f380d692fglennrp#if PNG_LIBPNG_VER >= 10400 1689a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristystatic png_voidp Magick_png_malloc(png_structp png_ptr,png_alloc_size_t size) 1690a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 1691a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristystatic png_voidp Magick_png_malloc(png_structp png_ptr,png_size_t size) 1692a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 16933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1694df0d90e1d3bbfa3956818ac7bf43aa0d008020dccristy (void) png_ptr; 16953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_voidp) AcquireMagickMemory((size_t) size)); 16963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 16973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 16983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 16993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free a pointer. It is removed from the list at the same time. 17003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1701cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic png_free_ptr Magick_png_free(png_structp png_ptr,png_voidp ptr) 17023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 17033bd393f9074299ed9f2f3d128e4985118077c2bdglennrp (void) png_ptr; 17043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ptr=RelinquishMagickMemory(ptr); 17053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((png_free_ptr) NULL); 17063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 17083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(__cplusplus) || defined(c_plusplus) 17103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 17113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 17123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17133ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int 1714edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrpMagick_png_read_raw_profile(png_struct *ping,Image *image, 1715edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp const ImageInfo *image_info, png_textp text,int ii,ExceptionInfo *exception) 17163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 1717bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 17183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 17193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 17213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp; 17223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register png_charp 17243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp; 17253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 17273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length, 17283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles; 17293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 17313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 17323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17330c3e06bd4809f97aeceaeb7c2334d8b2b850c2e1glennrp const unsigned char 17343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unhex[103]={0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 17353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 17363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,1, 2,3,4,5,6,7,8,9,0,0, 17373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0, 17383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,10,11,12, 17393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 13,14,15}; 17403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 17413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=text[ii].text+1; 17423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for newline */ 17433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != '\n') 17443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 17450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* look for length */ 17473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp == '\0' || *sp == ' ' || *sp == '\n') 17483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 17490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1750f2f2727f17ecbb23d902f70bb98f81faabc92dbdcristy length=(png_uint_32) StringToLong(sp); 17510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 175297f90e23c85b9c58387880125c29d8c99126f83aglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 175397f90e23c85b9c58387880125c29d8c99126f83aglennrp " length: %lu",(unsigned long) length); 175497f90e23c85b9c58387880125c29d8c99126f83aglennrp 17553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp != ' ' && *sp != '\n') 17563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 17570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* allocate space */ 17593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 0) 17603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1761edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping,"invalid profile length"); 17623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 17633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17658723e4bcd840478cecfd29891e792edb499cd0e9cristy profile=BlobToStringInfo((const void *) NULL,length); 17660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile == (StringInfo *) NULL) 17683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1769edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, "unable to copy profile"); 17703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 17713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* copy profile, skipping white space and column 1 "=" signs */ 17743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=GetStringInfoDatum(profile); 17753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy nibbles=length*2; 17760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1777bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) nibbles; i++) 17783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (*sp < '0' || (*sp > '9' && *sp < 'a') || *sp > 'f') 17803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 17813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*sp == '\0') 17823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1783edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, "ran out of profile data"); 17843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 17853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 17863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp++; 17883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%2 == 0) 17913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp=(unsigned char) (16*unhex[(int) *sp++]); 17920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 17933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 17943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (*dp++)+=unhex[(int) *sp++]; 17953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 17963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 17973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy We have already read "Raw profile type. 17983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 179916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProfile(image,&text[ii].key[17],profile,exception); 18003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=DestroyStringInfo(profile); 18010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 18023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 18033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf(" Found a generic profile, type %s\n",&text[ii].key[17]); 18040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 18053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return MagickTrue; 18063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 18093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic int read_vpag_chunk_callback(png_struct *ping, png_unknown_chunkp chunk) 18103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 18113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 18123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 18133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* The unknown chunk structure contains the chunk data: 18163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte name[5]; 18173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte *data; 18183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_size_t size; 18193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note that libpng has already taken care of the CRC handling. 18213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 18223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18232ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp LogMagickEvent(CoderEvent,GetMagickModule(), 18242ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp " read_vpag_chunk: found %c%c%c%c chunk", 18252ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp chunk->name[0],chunk->name[1],chunk->name[2],chunk->name[3]); 18263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->name[0] != 118 || chunk->name[1] != 112 || 18283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk->name[2] != 65 ||chunk-> name[3] != 103) 18293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* Did not recognize */ 18303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* recognized vpAg */ 18323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->size != 9) 18343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(-1); /* Error return */ 18353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk->data[8] != 0) 18373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(0); /* ImageMagick requires pixel units */ 18383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=(Image *) png_get_user_chunk_ptr(ping); 18403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1841bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.width=(size_t) ((chunk->data[0] << 24) | 18423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[1] << 16) | (chunk->data[2] << 8) | chunk->data[3]); 18430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1844bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->page.height=(size_t) ((chunk->data[4] << 24) | 18453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (chunk->data[5] << 16) | (chunk->data[6] << 8) | chunk->data[7]); 18463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Return one of the following: */ 18483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(-n); chunk had an error */ 18493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(0); did not recognize */ 18503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* return(n); success */ 18513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(1); 18533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 18543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 18553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 18563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1857fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 1858fd6fd07e58e3d37313bec849313ac6e2b92e3957dirkstatic void read_tIME_chunk(Image *image,png_struct *ping,png_info *info, 1859fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ExceptionInfo *exception) 1860fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk{ 1861fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_timep 1862fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time; 1863fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 1864fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (png_get_tIME(ping,info,&time)) 1865fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 1866fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk char 1867fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk timestamp[21]; 1868fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 1869fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk FormatLocaleString(timestamp,21,"%04d-%02d-%02dT%02d:%02d:%02dZ", 1870fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time->year,time->month,time->day,time->hour,time->minute,time->second); 1871fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk SetImageProperty(image,"png:tIME",timestamp,exception); 1872fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 1873fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk} 1874fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 1875fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 18763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 18773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e P N G I m a g e % 18823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 18853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOnePNGImage() reads a Portable Network Graphics (PNG) image file 18883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 18893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 18903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 18913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOnePNGImage method is: 18933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOnePNGImage(MngInfo *mng_info, const ImageInfo *image_info, 18953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 18963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 18983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 18993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 19003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 19013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 19023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 19033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 19043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 19053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 19063ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOnePNGImage(MngInfo *mng_info, 19073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 19083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 19093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Read one PNG image */ 19103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1911cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp /* To do: Read the tEXt/Creation Time chunk into the date:create property */ 1912cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp 19133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 19143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image; 19153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1916d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp char 1917ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp im_vers[32], 1918ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp libpng_runv[32], 1919ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp libpng_vers[32], 1920ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_runv[32], 1921ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_vers[32]; 1922d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 19233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 192498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp intent, /* "PNG Rendering intent", which is ICC intent + 1 */ 1925cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_raw_profiles, 19263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_text, 19274eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_text_total, 19283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 1929913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp number_colors, 1930faa852bad40107edae19405e76a299057668d795glennrp pass, 1931faa852bad40107edae19405e76a299057668d795glennrp ping_bit_depth, 1932faa852bad40107edae19405e76a299057668d795glennrp ping_color_type, 1933fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp ping_file_depth, 1934faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method, 1935faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method, 1936faa852bad40107edae19405e76a299057668d795glennrp ping_filter_method, 19374eb3931feb349dd87142c78503b779228f3e1a0fglennrp ping_num_trans, 19384eb3931feb349dd87142c78503b779228f3e1a0fglennrp unit_type; 19394eb3931feb349dd87142c78503b779228f3e1a0fglennrp 19404eb3931feb349dd87142c78503b779228f3e1a0fglennrp double 19414eb3931feb349dd87142c78503b779228f3e1a0fglennrp file_gamma; 19423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 19444383ec8c3c8811128f5a8a034d67c47db5e7e75acristy logging, 194598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_cHRM, 194698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_gAMA, 194798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_iCCP, 194898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_sRGB, 19493d627862fb79aad8a20be4f1587f0b8761db441aglennrp ping_found_sRGB_cHRM, 1950ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP, 19513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 19523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19530997332e2c35a821b271d6e7473c01c10dc206adcristy MemoryInfo 19540997332e2c35a821b271d6e7473c01c10dc206adcristy *volatile pixel_info; 19550997332e2c35a821b271d6e7473c01c10dc206adcristy 195616ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 195716ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color; 195816ea139d53d867211d3bb0fa859a83de653f687ecristy 195916ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 196016ea139d53d867211d3bb0fa859a83de653f687ecristy error_info; 196116ea139d53d867211d3bb0fa859a83de653f687ecristy 1962faa852bad40107edae19405e76a299057668d795glennrp png_bytep 1963faa852bad40107edae19405e76a299057668d795glennrp ping_trans_alpha; 1964faa852bad40107edae19405e76a299057668d795glennrp 1965faa852bad40107edae19405e76a299057668d795glennrp png_color_16p 1966faa852bad40107edae19405e76a299057668d795glennrp ping_background, 1967faa852bad40107edae19405e76a299057668d795glennrp ping_trans_color; 1968faa852bad40107edae19405e76a299057668d795glennrp 19693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 19703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *end_info, 19713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 19723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 19743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 19753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 19773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 19783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1979faa852bad40107edae19405e76a299057668d795glennrp png_uint_32 1980faa852bad40107edae19405e76a299057668d795glennrp ping_height, 1981faa852bad40107edae19405e76a299057668d795glennrp ping_width, 19824eb3931feb349dd87142c78503b779228f3e1a0fglennrp x_resolution, 19834eb3931feb349dd87142c78503b779228f3e1a0fglennrp y_resolution; 1984faa852bad40107edae19405e76a299057668d795glennrp 198516ea139d53d867211d3bb0fa859a83de653f687ecristy QuantumInfo 198616ea139d53d867211d3bb0fa859a83de653f687ecristy *quantum_info; 198716ea139d53d867211d3bb0fa859a83de653f687ecristy 1988bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 1989756ae430d36380dfab8ca703538f5922f3796351cristy ping_rowbytes, 19903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 19913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 19923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 19933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 19943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1995bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 19963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 19973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 19983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 199916ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 20003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 20013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 20023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 200339992b4dd9b12ef752d55b8e402c069698851f72glennrp length, 20043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset; 20053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2006eb3b22a03f31af7f724573d8537cd91fca06ee41cristy ssize_t 2007eb3b22a03f31af7f724573d8537cd91fca06ee41cristy j; 2008eb3b22a03f31af7f724573d8537cd91fca06ee41cristy 200975fc68f33e6e766a22e8ed653c3ed50b0d142827cristy unsigned char 20100997332e2c35a821b271d6e7473c01c10dc206adcristy *ping_pixels; 201155b78b53f1e013e0af19565ac04aaa7660d53795cristy 2012629960f505ebba710ec9b6953a539a21dab176f2glennrp#ifdef PNG_UNKNOWN_CHUNKS_SUPPORTED 20133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte unused_chunks[]= 20143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 20153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 104, 73, 83, 84, (png_byte) '\0', /* hIST */ 20163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 105, 84, 88, 116, (png_byte) '\0', /* iTXt */ 20173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112, 67, 65, 76, (png_byte) '\0', /* pCAL */ 20183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 67, 65, 76, (png_byte) '\0', /* sCAL */ 20193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115, 80, 76, 84, (png_byte) '\0', /* sPLT */ 2020fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if !defined(PNG_tIME_SUPPORTED) 20213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116, 73, 77, 69, (png_byte) '\0', /* tIME */ 2022fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 2023629960f505ebba710ec9b6953a539a21dab176f2glennrp#ifdef PNG_APNG_SUPPORTED /* libpng was built with APNG patch; */ 2024629960f505ebba710ec9b6953a539a21dab176f2glennrp /* ignore the APNG chunks */ 2025629960f505ebba710ec9b6953a539a21dab176f2glennrp 97, 99, 84, 76, (png_byte) '\0', /* acTL */ 2026629960f505ebba710ec9b6953a539a21dab176f2glennrp 102, 99, 84, 76, (png_byte) '\0', /* fcTL */ 2027629960f505ebba710ec9b6953a539a21dab176f2glennrp 102, 100, 65, 84, (png_byte) '\0', /* fdAT */ 2028629960f505ebba710ec9b6953a539a21dab176f2glennrp#endif 20293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 20303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2032d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp /* Define these outside of the following "if logging()" block so they will 2033d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp * show in debuggers. 2034d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp */ 2035d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *im_vers='\0'; 2036d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 2037ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp MagickLibVersionText,32); 2038d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 2039ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp MagickLibAddendum,32); 2040ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 2041d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *libpng_vers='\0'; 2042d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(libpng_vers, 2043ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp PNG_LIBPNG_VER_STRING,32); 2044ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *libpng_runv='\0'; 2045ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(libpng_runv, 2046ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp png_get_libpng_ver(NULL),32); 2047ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 2048d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *zlib_vers='\0'; 2049d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(zlib_vers, 2050ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp ZLIB_VERSION,32); 2051ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *zlib_runv='\0'; 2052ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(zlib_runv, 2053ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_version,32); 2054ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 20552dd1906783a5ece58a6105b4f59239e28b13caddglennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(), 20562dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Enter ReadOnePNGImage()\n" 20572dd1906783a5ece58a6105b4f59239e28b13caddglennrp " IM version = %s\n" 20582dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Libpng version = %s", 20592dd1906783a5ece58a6105b4f59239e28b13caddglennrp im_vers, libpng_vers); 20602dd1906783a5ece58a6105b4f59239e28b13caddglennrp 20612dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (logging != MagickFalse) 20622dd1906783a5ece58a6105b4f59239e28b13caddglennrp { 20632dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (LocaleCompare(libpng_vers,libpng_runv) != 0) 2064d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp { 20652dd1906783a5ece58a6105b4f59239e28b13caddglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 20662dd1906783a5ece58a6105b4f59239e28b13caddglennrp libpng_runv); 2067d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp } 20682dd1906783a5ece58a6105b4f59239e28b13caddglennrp LogMagickEvent(CoderEvent,GetMagickModule()," Zlib version = %s", 20692dd1906783a5ece58a6105b4f59239e28b13caddglennrp zlib_vers); 20702dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (LocaleCompare(zlib_vers,zlib_runv) != 0) 20712dd1906783a5ece58a6105b4f59239e28b13caddglennrp { 20722dd1906783a5ece58a6105b4f59239e28b13caddglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 20732dd1906783a5ece58a6105b4f59239e28b13caddglennrp zlib_runv); 20742dd1906783a5ece58a6105b4f59239e28b13caddglennrp } 20752dd1906783a5ece58a6105b4f59239e28b13caddglennrp } 2076d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 207725c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if (PNG_LIBPNG_VER < 10200) 20783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 20793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 20803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 20813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 20823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 208361b4c957269727a0a2526edc2331881da8346100glennrp#if (PNG_LIBPNG_VER >= 10400) 208461b4c957269727a0a2526edc2331881da8346100glennrp# ifndef PNG_TRANSFORM_GRAY_TO_RGB /* Added at libpng-1.4.0beta67 */ 208561b4c957269727a0a2526edc2331881da8346100glennrp if (image_info->verbose) 208661b4c957269727a0a2526edc2331881da8346100glennrp { 208761b4c957269727a0a2526edc2331881da8346100glennrp printf("Your PNG library (libpng-%s) is an old beta version.\n", 208861b4c957269727a0a2526edc2331881da8346100glennrp PNG_LIBPNG_VER_STRING); 208961b4c957269727a0a2526edc2331881da8346100glennrp printf("Please update it.\n"); 209061b4c957269727a0a2526edc2331881da8346100glennrp } 209161b4c957269727a0a2526edc2331881da8346100glennrp# endif 209261b4c957269727a0a2526edc2331881da8346100glennrp#endif 209361b4c957269727a0a2526edc2331881da8346100glennrp 209416ea139d53d867211d3bb0fa859a83de653f687ecristy 209516ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info = (QuantumInfo *) NULL; 20963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 20973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2098a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 209998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 2100a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void)LogMagickEvent(CoderEvent,GetMagickModule(), 21012dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Before reading:\n" 21022dd1906783a5ece58a6105b4f59239e28b13caddglennrp " image->alpha_trait=%d" 21032dd1906783a5ece58a6105b4f59239e28b13caddglennrp " image->rendering_intent=%d\n" 21042dd1906783a5ece58a6105b4f59239e28b13caddglennrp " image->colorspace=%d\n" 21052dd1906783a5ece58a6105b4f59239e28b13caddglennrp " image->gamma=%f", 21062dd1906783a5ece58a6105b4f59239e28b13caddglennrp (int) image->alpha_trait, (int) image->rendering_intent, 21072dd1906783a5ece58a6105b4f59239e28b13caddglennrp (int) image->colorspace, image->gamma); 210898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 210998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp intent=Magick_RenderingIntent_to_PNG_RenderingIntent(image->rendering_intent); 211098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 21110e319739731741c52a6303723e0c8678a0df5579glennrp /* Set to an out-of-range color unless tRNS chunk is present */ 21120e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.red=65537; 21130e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.green=65537; 21140e319739731741c52a6303723e0c8678a0df5579glennrp transparent_color.blue=65537; 211516ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha=65537; 21160e319739731741c52a6303723e0c8678a0df5579glennrp 2117913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp number_colors=0; 2118cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_text = 0; 21194eb3931feb349dd87142c78503b779228f3e1a0fglennrp num_text_total = 0; 2120cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp num_raw_profiles = 0; 2121cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 212298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_cHRM = MagickFalse; 212398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_gAMA = MagickFalse; 212498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_iCCP = MagickFalse; 212598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_sRGB = MagickFalse; 21264b917593e694424be469d250448c05c878663812glennrp ping_found_sRGB_cHRM = MagickFalse; 2127ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP = MagickFalse; 2128ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 212998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 21303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 21323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 213416ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.image=image; 213516ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.exception=exception; 21363e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_read_struct_2(PNG_LIBPNG_VER_STRING,&error_info, 2137cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler, NULL, 2138cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); 21393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 21403e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_read_struct(PNG_LIBPNG_VER_STRING,&error_info, 2141cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler); 21423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 21433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 21443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 21450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 21470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 21493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,(png_info **) NULL,(png_info **) NULL); 21513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 21523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy end_info=png_create_info_struct(ping); 21550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (end_info == (png_info *) NULL) 21573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,(png_info **) NULL); 21593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 21603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 21610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21620997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=(MemoryInfo *) NULL; 21630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2164faa852bad40107edae19405e76a299057668d795glennrp if (setjmp(png_jmpbuf(ping))) 21653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 21663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 21673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG image is corrupt. 21683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 21693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 2170edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2171868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 2172cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 21733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2174edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 21750997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info != (MemoryInfo *) NULL) 21760997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 2177edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 21783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 21793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 21803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() with error."); 21810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 2183057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk { 2184057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk const char 2185057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk *option; 2186057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk 2187057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk option=GetImageOption(image_info,"png:preserve-corrupt-image"); 2188057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk if (IsStringTrue(option) == MagickFalse) 2189057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk image->columns=0; 2190057a5d2cf6f95e2fbea1dc2abec0bc9463f77052dirk } 21910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 21923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 21933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2194edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2195edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* { For navigation to end of SETJMP-protected block. Within this 2196edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * block, use png_error() instead of Throwing an Exception, to ensure 2197edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * that libpng is able to clean up, and that the semaphore is unlocked. 2198edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 2199edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2200868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 2201edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp LockSemaphoreInfo(ping_semaphore); 2202edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 2203edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 2204943b7d3decdd71b57fba7c2fe73fa26f380d692fglennrp#ifdef PNG_BENIGN_ERRORS_SUPPORTED 2205a3a5f956194e91458e2789966ad15308e8f3df47glennrp /* Allow benign errors */ 2206a3a5f956194e91458e2789966ad15308e8f3df47glennrp png_set_benign_errors(ping, 1); 2207a3a5f956194e91458e2789966ad15308e8f3df47glennrp#endif 2208a3a5f956194e91458e2789966ad15308e8f3df47glennrp 2209f9eb20453e3475d44a3833f64c4a662c0106c43edirk#ifdef PNG_SET_USER_LIMITS_SUPPORTED 2210f9eb20453e3475d44a3833f64c4a662c0106c43edirk /* Reject images with too many rows or columns */ 2211f9eb20453e3475d44a3833f64c4a662c0106c43edirk png_set_user_limits(ping, 2212f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 2213f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(WidthResource)), 2214f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 2215f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(HeightResource))); 2216f9eb20453e3475d44a3833f64c4a662c0106c43edirk#endif /* PNG_SET_USER_LIMITS_SUPPORTED */ 2217f9eb20453e3475d44a3833f64c4a662c0106c43edirk 22183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 22193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for reading. 22203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 2221faa852bad40107edae19405e76a299057668d795glennrp 22223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 22233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sig_bytes(ping,8); 22240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 22263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 22273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 22283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 22293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 22313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) 22323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 22333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 22353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 22363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->bytes_in_read_buffer=0; 22373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->found_empty_plte=MagickFalse; 22383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index=MagickFalse; 22393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,mng_info,mng_get_data); 22403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 22430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 22443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 22453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_fn(ping,image,png_get_data); 22463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2247e604a757f40a91c286711c49577eeced17ea97adglennrp { 2248e604a757f40a91c286711c49577eeced17ea97adglennrp const char 2249e604a757f40a91c286711c49577eeced17ea97adglennrp *value; 2250e604a757f40a91c286711c49577eeced17ea97adglennrp 2251e604a757f40a91c286711c49577eeced17ea97adglennrp value=GetImageOption(image_info,"profile:skip"); 2252e604a757f40a91c286711c49577eeced17ea97adglennrp 2253e604a757f40a91c286711c49577eeced17ea97adglennrp if (IsOptionMember("ICC",value) == MagickFalse) 2254e604a757f40a91c286711c49577eeced17ea97adglennrp { 2255e604a757f40a91c286711c49577eeced17ea97adglennrp 2256e604a757f40a91c286711c49577eeced17ea97adglennrp value=GetImageOption(image_info,"png:preserve-iCCP"); 2257e604a757f40a91c286711c49577eeced17ea97adglennrp 2258e604a757f40a91c286711c49577eeced17ea97adglennrp if (value == NULL) 2259e604a757f40a91c286711c49577eeced17ea97adglennrp value=GetImageArtifact(image,"png:preserve-iCCP"); 2260e604a757f40a91c286711c49577eeced17ea97adglennrp 2261e604a757f40a91c286711c49577eeced17ea97adglennrp if (value != NULL) 2262e604a757f40a91c286711c49577eeced17ea97adglennrp ping_preserve_iCCP=MagickTrue; 2263201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp 2264201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp#if defined(PNG_SKIP_sRGB_CHECK_PROFILE) && defined(PNG_SET_OPTION_SUPPORTED) 2265201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp /* Don't let libpng check for ICC/sRGB profile because we're going 2266201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp * to do that anyway. This feature was added at libpng-1.6.12. 2267cf45b20b2d8abda43638bdcece704c78090ecbb2glennrp * If logging, go ahead and check and issue a warning as appropriate. 2268201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp */ 2269cf45b20b2d8abda43638bdcece704c78090ecbb2glennrp if (logging == MagickFalse) 2270cf45b20b2d8abda43638bdcece704c78090ecbb2glennrp png_set_option(ping, PNG_SKIP_sRGB_CHECK_PROFILE, PNG_OPTION_ON); 2271201f0c995969c480e7cf0285e5826c4c6903b7a1glennrp#endif 2272e604a757f40a91c286711c49577eeced17ea97adglennrp } 2273e604a757f40a91c286711c49577eeced17ea97adglennrp#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 2274e604a757f40a91c286711c49577eeced17ea97adglennrp else 2275e604a757f40a91c286711c49577eeced17ea97adglennrp { 2276e604a757f40a91c286711c49577eeced17ea97adglennrp png_set_keep_unknown_chunks(ping, 1, mng_iCCP, 1); 2277e604a757f40a91c286711c49577eeced17ea97adglennrp } 2278e604a757f40a91c286711c49577eeced17ea97adglennrp#endif 2279e604a757f40a91c286711c49577eeced17ea97adglennrp } 22803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED) 22813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Ignore unused chunks and all unknown chunks except for vpAg */ 22822ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp#if PNG_LIBPNG_VER < 10700 /* Avoid libpng16 warning */ 22832ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp png_set_keep_unknown_chunks(ping, 2, NULL, 0); 22842ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp#else 22853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, NULL, 0); 22862ad70151f4224c47dd9e23caf7d6620c4434fc57glennrp#endif 22873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 2, mng_vpAg, 1); 22883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_keep_unknown_chunks(ping, 1, unused_chunks, 22893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int)sizeof(unused_chunks)/5); 22903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Callback for other unknown chunks */ 22913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_read_user_chunk_fn(ping, image, read_vpag_chunk_callback); 22923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 22933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 22942feb141b6f74ce425fed3272286fab1f50366bb9glennrp#ifdef PNG_SET_USER_LIMITS_SUPPORTED 229509cd96287f72032f4d49a779d65e1546e85f6b9fglennrp# if (PNG_LIBPNG_VER >= 10400) 22962feb141b6f74ce425fed3272286fab1f50366bb9glennrp /* Limit the size of the chunk storage cache used for sPLT, text, 2297687361928f16a28ea56e200d00e970e68173cc25glennrp * and unknown chunks. 22982feb141b6f74ce425fed3272286fab1f50366bb9glennrp */ 2299687361928f16a28ea56e200d00e970e68173cc25glennrp png_set_chunk_cache_max(ping, 32767); 230009cd96287f72032f4d49a779d65e1546e85f6b9fglennrp# endif 23012feb141b6f74ce425fed3272286fab1f50366bb9glennrp#endif 23022feb141b6f74ce425fed3272286fab1f50366bb9glennrp 23039bf97b6c2143eb20c330346b01e82102cc082725glennrp#ifdef PNG_READ_CHECK_FOR_INVALID_INDEX_SUPPORTED 23049bf97b6c2143eb20c330346b01e82102cc082725glennrp /* Disable new libpng-1.5.10 feature */ 23059bf97b6c2143eb20c330346b01e82102cc082725glennrp png_set_check_for_invalid_index (ping, 0); 23069bf97b6c2143eb20c330346b01e82102cc082725glennrp#endif 23079bf97b6c2143eb20c330346b01e82102cc082725glennrp 2308991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp#if (PNG_LIBPNG_VER < 10400) 2309991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# if defined(PNG_USE_PNGGCCRD) && defined(PNG_ASSEMBLER_CODE_SUPPORTED) && \ 2310991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp (PNG_LIBPNG_VER >= 10200) && (PNG_LIBPNG_VER < 10220) && defined(__i386__) 23113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Disable thread-unsafe features of pnggccrd */ 23123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_access_version_number() >= 10200) 23133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 mmx_disable_mask=0; 23153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 asm_flags; 23163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mmx_disable_mask |= ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \ 23183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \ 23193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \ 23203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ); 23213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy asm_flags=png_get_asm_flags(ping); 23223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_asm_flags(ping, asm_flags & ~mmx_disable_mask); 23233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2324991e92a91acb9e432cd6c05843e4f6a57643e29dglennrp# endif 23253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 23263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 23273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_info(ping,ping_info); 2328faa852bad40107edae19405e76a299057668d795glennrp 2329faa852bad40107edae19405e76a299057668d795glennrp png_get_IHDR(ping,ping_info,&ping_width,&ping_height, 2330faa852bad40107edae19405e76a299057668d795glennrp &ping_bit_depth,&ping_color_type, 2331faa852bad40107edae19405e76a299057668d795glennrp &ping_interlace_method,&ping_compression_method, 2332faa852bad40107edae19405e76a299057668d795glennrp &ping_filter_method); 2333faa852bad40107edae19405e76a299057668d795glennrp 2334fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp ping_file_depth = ping_bit_depth; 2335fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp 23360d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp /* Swap bytes if requested */ 23370d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp if (ping_file_depth == 16) 23380d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp { 23390d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp const char 2340a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp *value; 23416647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 2342a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp value=GetImageOption(image_info,"png:swap-bytes"); 23436647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 2344a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp if (value == NULL) 2345a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp value=GetImageArtifact(image,"png:swap-bytes"); 23466647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 2347a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp if (value != NULL) 2348a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp png_set_swap(ping); 23490d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp } 23500d767725a26a52a3c8362cbb1b88cbe0fd52522dglennrp 23515830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp /* Save bit-depth and color-type in case we later want to write a PNG00 */ 23525830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 23535830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp char 2354151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy msg[MagickPathExtent]; 23555830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 2356151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d",(int) ping_color_type); 23573398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:IHDR.color-type-orig",msg,exception); 23585830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 2359151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d",(int) ping_bit_depth); 23603398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:IHDR.bit-depth-orig",msg,exception); 23615830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 23625830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 2363faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_tRNS(ping, ping_info, &ping_trans_alpha, &ping_num_trans, 2364faa852bad40107edae19405e76a299057668d795glennrp &ping_trans_color); 2365faa852bad40107edae19405e76a299057668d795glennrp 2366faa852bad40107edae19405e76a299057668d795glennrp (void) png_get_bKGD(ping, ping_info, &ping_background); 2367faa852bad40107edae19405e76a299057668d795glennrp 2368faa852bad40107edae19405e76a299057668d795glennrp if (ping_bit_depth < 8) 23693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2370fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp png_set_packing(ping); 2371fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp ping_bit_depth = 8; 23723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2373faa852bad40107edae19405e76a299057668d795glennrp 2374faa852bad40107edae19405e76a299057668d795glennrp image->depth=ping_bit_depth; 23753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->depth=GetImageQuantumDepth(image,MagickFalse); 2376faa852bad40107edae19405e76a299057668d795glennrp image->interlace=ping_interlace_method != 0 ? PNGInterlace : NoInterlace; 237798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 2378176b29a003f11fd934137871d574995319408665cristy if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 2379176b29a003f11fd934137871d574995319408665cristy ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) 2380176b29a003f11fd934137871d574995319408665cristy { 2381176b29a003f11fd934137871d574995319408665cristy image->rendering_intent=UndefinedIntent; 238298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp intent=Magick_RenderingIntent_to_PNG_RenderingIntent(UndefinedIntent); 2383176b29a003f11fd934137871d574995319408665cristy (void) ResetMagickMemory(&image->chromaticity,0, 2384176b29a003f11fd934137871d574995319408665cristy sizeof(image->chromaticity)); 2385176b29a003f11fd934137871d574995319408665cristy } 238698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 23873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 23883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 23893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 23902dd1906783a5ece58a6105b4f59239e28b13caddglennrp " PNG width: %.20g, height: %.20g\n" 23912dd1906783a5ece58a6105b4f59239e28b13caddglennrp " PNG color_type: %d, bit_depth: %d\n" 23922dd1906783a5ece58a6105b4f59239e28b13caddglennrp " PNG compression_method: %d\n" 23933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " PNG interlace_method: %d, filter_method: %d", 23942dd1906783a5ece58a6105b4f59239e28b13caddglennrp (double) ping_width, (double) ping_height, 23952dd1906783a5ece58a6105b4f59239e28b13caddglennrp ping_color_type, ping_bit_depth, 23962dd1906783a5ece58a6105b4f59239e28b13caddglennrp ping_compression_method, 2397faa852bad40107edae19405e76a299057668d795glennrp ping_interlace_method,ping_filter_method); 23982dd1906783a5ece58a6105b4f59239e28b13caddglennrp 23993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 24003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2401ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (png_get_valid(ping,ping_info, PNG_INFO_iCCP)) 2402ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2403ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_found_iCCP=MagickTrue; 2404ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (logging != MagickFalse) 2405ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2406ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Found PNG iCCP chunk."); 2407ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2408ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 240998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (png_get_valid(ping,ping_info,PNG_INFO_gAMA)) 241098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 241198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_gAMA=MagickTrue; 241298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (logging != MagickFalse) 241398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 241498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp " Found PNG gAMA chunk."); 241598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 241698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 241798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 241898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 241998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp ping_found_cHRM=MagickTrue; 242098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (logging != MagickFalse) 242198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 242298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp " Found PNG cHRM chunk."); 242398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 242498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 2425ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (ping_found_iCCP != MagickTrue && png_get_valid(ping,ping_info, 2426ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp PNG_INFO_sRGB)) 242798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 2428ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_found_sRGB=MagickTrue; 242998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (logging != MagickFalse) 243098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2431ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Found PNG sRGB chunk."); 243298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 243398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 2434ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#ifdef PNG_READ_iCCP_SUPPORTED 2435e604a757f40a91c286711c49577eeced17ea97adglennrp if (ping_found_iCCP !=MagickTrue && 2436ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_found_sRGB != MagickTrue && 2437ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_get_valid(ping,ping_info, PNG_INFO_iCCP)) 243898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp { 2439ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_found_iCCP=MagickTrue; 244098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (logging != MagickFalse) 244198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2442ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Found PNG iCCP chunk."); 244398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp } 244498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 2445faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_iCCP)) 24463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 24483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy compression; 24493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2450e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 2451e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp png_charp 2452e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp info; 2453e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#else 2454e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp png_bytep 2455e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp info; 2456e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#endif 2457e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp 24583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 24593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name; 24603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 24623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile_length; 24633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_iCCP(ping,ping_info,&name,(int *) &compression,&info, 24653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &profile_length); 24660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 24673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile_length != 0) 24683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 24693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 24703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 24713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 24723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 24733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 24743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG iCCP chunk."); 2475ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2476e8f8f3877ede9cbc125b64c8f760c7c4a63bc00fcristy profile=BlobToStringInfo(info,profile_length); 2477ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2478e8f8f3877ede9cbc125b64c8f760c7c4a63bc00fcristy if (profile == (StringInfo *) NULL) 2479ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2480ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_warning(ping, "ICC profile is NULL"); 2481ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile=DestroyStringInfo(profile); 2482ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2483ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp else 2484ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2485ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (ping_preserve_iCCP == MagickFalse) 2486edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2487ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp int 2488ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp icheck, 2489ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc=0; 2490ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2491ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2492ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_uint_32 2493ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp length, 2494ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=0; 2495ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2496ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp unsigned char 2497ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp *data; 2498ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2499ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp length=(png_uint_32) GetStringInfoLength(profile); 2500ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2501ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp for (icheck=0; sRGB_info[icheck].len > 0; icheck++) 2502ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2503ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (length == sRGB_info[icheck].len) 2504ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2505ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (got_crc == 0) 2506ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2507ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2508ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Got a %lu-byte ICC profile (potentially sRGB)", 2509ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (unsigned long) length); 2510ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2511ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp data=GetStringInfoDatum(profile); 2512ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=crc32(0,data,length); 2513ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2514ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2515ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " with crc=%8x",(unsigned int) profile_crc); 2516ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc++; 2517ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2518ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2519ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (profile_crc == sRGB_info[icheck].crc) 2520ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2521ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2522ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " It is sRGB with rendering intent = %s", 2523ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntentString_from_PNG_RenderingIntent( 2524ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent)); 2525ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (image->rendering_intent==UndefinedIntent) 2526ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2527ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp image->rendering_intent= 2528ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntent_from_PNG_RenderingIntent( 2529ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent); 2530ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2531ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp break; 2532ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2533ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2534ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2535ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (sRGB_info[icheck].len == 0) 2536ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2537ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2538ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Got a %lu-byte ICC profile not recognized as sRGB", 2539ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (unsigned long) length); 2540ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) SetImageProfile(image,"icc",profile,exception); 2541ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2542edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2543ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp else /* Preserve-iCCP */ 2544edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2545ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) SetImageProfile(image,"icc",profile,exception); 2546edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2547ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2548ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile=DestroyStringInfo(profile); 2549ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 25503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2553ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 25543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sRGB_SUPPORTED) 25553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2556ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (ping_found_iCCP==MagickFalse && png_get_valid(ping,ping_info, 2557ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp PNG_INFO_sRGB)) 2558ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2559ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (png_get_sRGB(ping,ping_info,&intent)) 25603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2561ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (image->rendering_intent == UndefinedIntent) 2562ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp image->rendering_intent= 2563ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntent_from_PNG_RenderingIntent (intent); 25640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 25663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2567e610a071534e448c46460a5aa39ede33bf56b329glennrp " Reading PNG sRGB chunk: rendering_intent: %d",intent); 25683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2569ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 2570ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2571ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp else if (mng_info->have_global_srgb) 2572ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 2573ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (image->rendering_intent == UndefinedIntent) 2574ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp image->rendering_intent= 2575ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntent_from_PNG_RenderingIntent 2576ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (mng_info->global_srgb_intent); 2577ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 25783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2580ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 2581ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 25823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2583faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_gAMA(ping,ping_info,&file_gamma)) 2584faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_gama) 2585faa852bad40107edae19405e76a299057668d795glennrp png_set_gAMA(ping,ping_info,mng_info->global_gamma); 25860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 25873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (png_get_gAMA(ping,ping_info,&file_gamma)) 25883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 25893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->gamma=(float) file_gamma; 25903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 25913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 25923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG gAMA chunk: gamma: %f",file_gamma); 25933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 25943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 259598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp 2596faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 2597faa852bad40107edae19405e76a299057668d795glennrp { 2598faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_chrm != MagickFalse) 2599faa852bad40107edae19405e76a299057668d795glennrp { 2600faa852bad40107edae19405e76a299057668d795glennrp (void) png_set_cHRM(ping,ping_info, 2601faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.x, 2602faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.white_point.y, 2603faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.x, 2604faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.red_primary.y, 2605faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.x, 2606faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.green_primary.y, 2607faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.x, 2608faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_chrm.blue_primary.y); 2609faa852bad40107edae19405e76a299057668d795glennrp } 2610faa852bad40107edae19405e76a299057668d795glennrp } 26110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2612faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_cHRM)) 26133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_cHRM(ping,ping_info, 26153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.x, 26163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.white_point.y, 26173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.x, 26183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.red_primary.y, 26193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.x, 26203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.green_primary.y, 26213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.x, 26223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &image->chromaticity.blue_primary.y); 26230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2624ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_found_cHRM=MagickTrue; 2625ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 26263d627862fb79aad8a20be4f1587f0b8761db441aglennrp if (image->chromaticity.red_primary.x>0.6399f && 26273d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.x<0.6401f && 26283d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y>0.3299f && 26293d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y<0.3301f && 26303d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x>0.2999f && 26313d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x<0.3001f && 26323d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y>0.5999f && 26333d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y<0.6001f && 26343d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x>0.1499f && 26353d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x<0.1501f && 26363d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y>0.0599f && 26373d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y<0.0601f && 26383d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x>0.3126f && 26393d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x<0.3128f && 26403d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y>0.3289f && 26413d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y<0.3291f) 26423d627862fb79aad8a20be4f1587f0b8761db441aglennrp ping_found_sRGB_cHRM=MagickTrue; 26433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2645e610a071534e448c46460a5aa39ede33bf56b329glennrp if (image->rendering_intent != UndefinedIntent) 26463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26473d627862fb79aad8a20be4f1587f0b8761db441aglennrp if (ping_found_sRGB != MagickTrue && 26483d627862fb79aad8a20be4f1587f0b8761db441aglennrp (ping_found_gAMA != MagickTrue || 264984288238d90b2e1831857d6b2427abd7875b7e1bglennrp (image->gamma > .45 && image->gamma < .46)) && 26503d627862fb79aad8a20be4f1587f0b8761db441aglennrp (ping_found_cHRM != MagickTrue || 2651cd8b331760407523f2a59cc65c1cd9c3d4422bafcristy ping_found_sRGB_cHRM != MagickFalse) && 26523d627862fb79aad8a20be4f1587f0b8761db441aglennrp ping_found_iCCP != MagickTrue) 26535cf1bff142633838354b1080183c957900bc80e8glennrp { 26545cf1bff142633838354b1080183c957900bc80e8glennrp png_set_sRGB(ping,ping_info, 26555cf1bff142633838354b1080183c957900bc80e8glennrp Magick_RenderingIntent_to_PNG_RenderingIntent 26565cf1bff142633838354b1080183c957900bc80e8glennrp (image->rendering_intent)); 26575cf1bff142633838354b1080183c957900bc80e8glennrp file_gamma=1.000f/2.200f; 26585cf1bff142633838354b1080183c957900bc80e8glennrp ping_found_sRGB=MagickTrue; 265984288238d90b2e1831857d6b2427abd7875b7e1bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2660918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp " Setting sRGB as if in input"); 26615cf1bff142633838354b1080183c957900bc80e8glennrp } 26623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26635cf1bff142633838354b1080183c957900bc80e8glennrp 26643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_oFFs_SUPPORTED) 2665faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 26663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2667905ef80dad2c83a01a607533f7039528ca7766b9cristy image->page.x=(ssize_t) png_get_x_offset_pixels(ping, ping_info); 2668905ef80dad2c83a01a607533f7039528ca7766b9cristy image->page.y=(ssize_t) png_get_y_offset_pixels(ping, ping_info); 26690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 26703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 26713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x || image->page.y) 26723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2673e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG oFFs chunk: x: %.20g, y: %.20g.",(double) 2674e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy image->page.x,(double) image->page.y); 26753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 26763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 26773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 2678faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 2679faa852bad40107edae19405e76a299057668d795glennrp { 2680faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_phys) 2681faa852bad40107edae19405e76a299057668d795glennrp { 2682faa852bad40107edae19405e76a299057668d795glennrp png_set_pHYs(ping,ping_info, 2683faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_x_pixels_per_unit, 2684faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_y_pixels_per_unit, 2685faa852bad40107edae19405e76a299057668d795glennrp mng_info->global_phys_unit_type); 2686faa852bad40107edae19405e76a299057668d795glennrp } 2687faa852bad40107edae19405e76a299057668d795glennrp } 2688faa852bad40107edae19405e76a299057668d795glennrp 26895c97f62ba919c3c109f0072df3b560056565e9e7cristy x_resolution=0; 26905c97f62ba919c3c109f0072df3b560056565e9e7cristy y_resolution=0; 26915c97f62ba919c3c109f0072df3b560056565e9e7cristy unit_type=0; 2692faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 26933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 26943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 26953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image resolution. 26963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 26973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_pHYs(ping,ping_info,&x_resolution,&y_resolution, 26980881b52ab4fee8427578a694081946c4c4e92b35cristy &unit_type); 269916ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) x_resolution; 270016ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) y_resolution; 27010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (unit_type == PNG_RESOLUTION_METER) 27033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 270516ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) x_resolution/100.0; 270616ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) y_resolution/100.0; 27073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 27103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2711e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 2712e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) x_resolution,(double) y_resolution,unit_type); 27133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2715823b55c200d7fc1818ab539b036a9c24feaecda8glennrp 2716faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 27173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 27193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 27203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 27213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 27220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((number_colors == 0) && 2724faa852bad40107edae19405e76a299057668d795glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE)) 27253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte_length) 27273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_PLTE(ping,ping_info,mng_info->global_plte, 27293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (int) mng_info->global_plte_length); 27300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2731faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 2732edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 27333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_trns_length) 27343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2735edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_warning(ping, 2736edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp "global tRNS has more entries than global PLTE"); 27373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2738edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp else 2739edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp { 2740edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_set_tRNS(ping,ping_info,mng_info->global_trns, 2741edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp (int) mng_info->global_trns_length,NULL); 2742edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2743edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp } 2744bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#ifdef PNG_READ_bKGD_SUPPORTED 27453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ( 27463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 27473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_saved_bkgd_index || 27483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2749faa852bad40107edae19405e76a299057668d795glennrp png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 27503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 27513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_color_16 27523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background; 27533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 27543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 27553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_saved_bkgd_index) 27563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.index=mng_info->saved_bkgd_index; 27573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2758faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping, ping_info, PNG_INFO_bKGD)) 2759faa852bad40107edae19405e76a299057668d795glennrp background.index=ping_background->index; 27600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.red=(png_uint_16) 27623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].red; 27630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.green=(png_uint_16) 27653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].green; 27660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 27673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy background.blue=(png_uint_16) 27683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[background.index].blue; 27690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2770c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp background.gray=(png_uint_16) 2771c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp mng_info->global_plte[background.index].green; 2772c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 27733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_bKGD(ping,ping_info,&background); 27743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 27763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 2778edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"No global PLTE in file"); 27793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 27813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2782bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#ifdef PNG_READ_bKGD_SUPPORTED 2783faa852bad40107edae19405e76a299057668d795glennrp if (mng_info->have_global_bkgd && 2784faa852bad40107edae19405e76a299057668d795glennrp (!png_get_valid(ping,ping_info,PNG_INFO_bKGD))) 27853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_info->mng_global_bkgd; 27860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2787faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 27883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2789bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp unsigned int 2790bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale; 2791bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp 27922dd1906783a5ece58a6105b4f59239e28b13caddglennrp /* Set image background color. 27932dd1906783a5ece58a6105b4f59239e28b13caddglennrp * Scale background components to 16-bit, then scale 2794bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp * to quantum depth 2795bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp */ 27962cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2797bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 1; 27980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2799fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp if (ping_file_depth == 1) 2800bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 255; 28010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2802fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp else if (ping_file_depth == 2) 2803bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 85; 28040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2805fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp else if (ping_file_depth == 4) 2806bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale = 17; 28070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2808fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp if (ping_file_depth <= 8) 2809bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp bkgd_scale *= 257; 28102cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2811bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->red *= bkgd_scale; 2812bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->green *= bkgd_scale; 2813bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ping_background->blue *= bkgd_scale; 28142cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2815bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (logging != MagickFalse) 2816bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp { 28172dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (logging != MagickFalse) 28182dd1906783a5ece58a6105b4f59239e28b13caddglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28192dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Reading PNG bKGD chunk, raw ping_background=(%d,%d,%d).\n" 28202dd1906783a5ece58a6105b4f59239e28b13caddglennrp " bkgd_scale=%d. ping_background=(%d,%d,%d).", 28212dd1906783a5ece58a6105b4f59239e28b13caddglennrp ping_background->red,ping_background->green, 28222dd1906783a5ece58a6105b4f59239e28b13caddglennrp ping_background->blue, 28232dd1906783a5ece58a6105b4f59239e28b13caddglennrp bkgd_scale,ping_background->red, 28242dd1906783a5ece58a6105b4f59239e28b13caddglennrp ping_background->green,ping_background->blue); 2825bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp } 28262cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2827bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.red= 2828faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->red); 28290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2830bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.green= 2831faa852bad40107edae19405e76a299057668d795glennrp ScaleShortToQuantum(ping_background->green); 28320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 2833bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp image->background_color.blue= 2834bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp ScaleShortToQuantum(ping_background->blue); 28350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 283616ea139d53d867211d3bb0fa859a83de653f687ecristy image->background_color.alpha=OpaqueAlpha; 28372cbb4489df0a2a31907769956f217d4b9d982bd0glennrp 2838bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp if (logging != MagickFalse) 2839bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 2840bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp " image->background_color=(%.20g,%.20g,%.20g).", 2841bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.red, 2842bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.green, 2843bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp (double) image->background_color.blue); 28443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 2845bfd9e61977198bea7d1ba9bf432226c6de0c38beglennrp#endif /* PNG_READ_bKGD_SUPPORTED */ 2846a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2847faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 28483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 2850a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp Image has a tRNS chunk. 28513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 28523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 28533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy max_sample; 28543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 285535ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 285635ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 285735ef824baa82511126ff0072ae30eee0da9c05a3cristy 28583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 28593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG tRNS chunk."); 28613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2862fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp max_sample = (int) ((one << ping_file_depth) - 1); 28633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2864faa852bad40107edae19405e76a299057668d795glennrp if ((ping_color_type == PNG_COLOR_TYPE_GRAY && 2865faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->gray > max_sample) || 2866faa852bad40107edae19405e76a299057668d795glennrp (ping_color_type == PNG_COLOR_TYPE_RGB && 2867faa852bad40107edae19405e76a299057668d795glennrp ((int)ping_trans_color->red > max_sample || 2868faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->green > max_sample || 2869faa852bad40107edae19405e76a299057668d795glennrp (int)ping_trans_color->blue > max_sample))) 28703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 28723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Ignoring PNG tRNS chunk with out-of-range sample."); 28743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free_data(ping, ping_info, PNG_FREE_TRNS, 0); 2875faa852bad40107edae19405e76a299057668d795glennrp png_set_invalid(ping,ping_info,PNG_INFO_tRNS); 28768a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 28773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 28783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 28793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2880a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp int 28819b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp scale_to_short; 2882a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2883fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp scale_to_short = 65535L/((1UL << ping_file_depth)-1); 2884a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 2885a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp /* Scale transparent_color to short */ 2886a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.red= scale_to_short*ping_trans_color->red; 2887a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.green= scale_to_short*ping_trans_color->green; 2888a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp transparent_color.blue= scale_to_short*ping_trans_color->blue; 288916ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha= scale_to_short*ping_trans_color->gray; 289005eb4a94b088c7f75605e7c1ec06bd13a6b34a3fglennrp 2891faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 28923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 28930f111984738842d27d04aed2a3f823d82a943506glennrp if (logging != MagickFalse) 28940f111984738842d27d04aed2a3f823d82a943506glennrp { 28950f111984738842d27d04aed2a3f823d82a943506glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 28962dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Raw tRNS graylevel = %d, scaled graylevel = %d.", 28972dd1906783a5ece58a6105b4f59239e28b13caddglennrp (int) ping_trans_color->gray,(int) transparent_color.alpha); 28980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 28990f111984738842d27d04aed2a3f823d82a943506glennrp } 290016ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red=transparent_color.alpha; 290116ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green=transparent_color.alpha; 290216ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue=transparent_color.alpha; 29033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_READ_sBIT_SUPPORTED) 29073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->have_global_sbit) 29083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2909faa852bad40107edae19405e76a299057668d795glennrp if (!png_get_valid(ping,ping_info,PNG_INFO_sBIT)) 29103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_sBIT(ping,ping_info,&mng_info->global_sbit); 29113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 29133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 2914faa852bad40107edae19405e76a299057668d795glennrp 29153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_read_update_info(ping,ping_info); 2916faa852bad40107edae19405e76a299057668d795glennrp 2917faa852bad40107edae19405e76a299057668d795glennrp ping_rowbytes=png_get_rowbytes(ping,ping_info); 2918faa852bad40107edae19405e76a299057668d795glennrp 29193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 29203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image structure. 29213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 29223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.left=0; 2923bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.right=(ssize_t) ping_width; 29243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_box.top=0; 2925bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->image_box.bottom=(ssize_t) ping_height; 29263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 29273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2928faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_width=ping_width; 2929faa852bad40107edae19405e76a299057668d795glennrp mng_info->mng_height=ping_height; 29303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame=mng_info->image_box; 29313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_info->image_box; 29323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 29353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[mng_info->object_id]; 29373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 29380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 29393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->compression=ZipCompression; 2940faa852bad40107edae19405e76a299057668d795glennrp image->columns=ping_width; 2941faa852bad40107edae19405e76a299057668d795glennrp image->rows=ping_height; 2942a6c5d34901e480ed05ae3d7be9b4725d6e5ea246glennrp 294316ea139d53d867211d3bb0fa859a83de653f687ecristy if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 294416ea139d53d867211d3bb0fa859a83de653f687ecristy ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA)) 29458d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp { 29460a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp double 29470a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp image_gamma = image->gamma; 29480a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp 29490a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp (void)LogMagickEvent(CoderEvent,GetMagickModule(), 29500a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp " image->gamma=%f",(float) image_gamma); 29510a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp 29520a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp if (image_gamma > 0.75) 29538d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp { 29540a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp /* Set image->rendering_intent to Undefined, 2955e88af7706d1540872ed85dd059a8faf3339d3f5bglennrp * image->colorspace to GRAY, and reset image->chromaticity. 29568d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp */ 295767429939a9bdca8c2ea541cd690b8e479c921527glennrp image->intensity = Rec709LuminancePixelIntensityMethod; 29588d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp SetImageColorspace(image,GRAYColorspace,exception); 29598d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp } 2960ccc36af759d30fb50b1deda241d038402a393b17glennrp else 2961ccc36af759d30fb50b1deda241d038402a393b17glennrp { 2962ccc36af759d30fb50b1deda241d038402a393b17glennrp RenderingIntent 2963ccc36af759d30fb50b1deda241d038402a393b17glennrp save_rendering_intent = image->rendering_intent; 2964ccc36af759d30fb50b1deda241d038402a393b17glennrp ChromaticityInfo 2965ccc36af759d30fb50b1deda241d038402a393b17glennrp save_chromaticity = image->chromaticity; 2966ccc36af759d30fb50b1deda241d038402a393b17glennrp 2967ccc36af759d30fb50b1deda241d038402a393b17glennrp SetImageColorspace(image,GRAYColorspace,exception); 2968ccc36af759d30fb50b1deda241d038402a393b17glennrp image->rendering_intent = save_rendering_intent; 2969ccc36af759d30fb50b1deda241d038402a393b17glennrp image->chromaticity = save_chromaticity; 2970ccc36af759d30fb50b1deda241d038402a393b17glennrp } 2971ccc36af759d30fb50b1deda241d038402a393b17glennrp 2972ccc36af759d30fb50b1deda241d038402a393b17glennrp image->gamma = image_gamma; 29738d0bca5eb90971dbd2100bb5d7a8de9e39f76595glennrp } 29746647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 2975e88af7706d1540872ed85dd059a8faf3339d3f5bglennrp (void)LogMagickEvent(CoderEvent,GetMagickModule(), 29760a5b92ca99910144e70ca19c74d7bfe35eec6fc6glennrp " image->colorspace=%d",(int) image->colorspace); 2977a6c5d34901e480ed05ae3d7be9b4725d6e5ea246glennrp 2978faa852bad40107edae19405e76a299057668d795glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 297932340ffa74550819f755f966e397ed58bbccd8e5glennrp ((int) ping_bit_depth < 16 && 298032340ffa74550819f755f966e397ed58bbccd8e5glennrp (int) ping_color_type == PNG_COLOR_TYPE_GRAY)) 29813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 2982befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 2983befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 2984befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 29853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=PseudoClass; 2986befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 2987fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp image->colors=one << ping_file_depth; 29883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (MAGICKCORE_QUANTUM_DEPTH == 8) 29893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->colors > 256) 299067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colors=256; 299167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#else 299267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->colors > 65536L) 299367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colors=65536L; 29943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 2995faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 29963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 29973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 29983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 29993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 3001bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy image->colors=(size_t) number_colors; 30020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 30043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 30053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG PLTE chunk: number_colors: %d.",number_colors); 30063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 30103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 30123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image colormap. 30133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 301416ea139d53d867211d3bb0fa859a83de653f687ecristy if (AcquireImageColormap(image,image->colors,exception) == MagickFalse) 3015edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 30160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3017faa852bad40107edae19405e76a299057668d795glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 30183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 30203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette; 30213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 30223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_get_PLTE(ping,ping_info,&palette,&number_colors); 30230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30246af6cf1a950b111ad0ac706269a703086693ba71glennrp for (i=0; i < (ssize_t) number_colors; i++) 30253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=ScaleCharToQuantum(palette[i].red); 30273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=ScaleCharToQuantum(palette[i].green); 30283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=ScaleCharToQuantum(palette[i].blue); 30293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30306af6cf1a950b111ad0ac706269a703086693ba71glennrp 303167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp for ( ; i < (ssize_t) image->colors; i++) 30326af6cf1a950b111ad0ac706269a703086693ba71glennrp { 30336af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].red=0; 30346af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].green=0; 30356af6cf1a950b111ad0ac706269a703086693ba71glennrp image->colormap[i].blue=0; 30366af6cf1a950b111ad0ac706269a703086693ba71glennrp } 30373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 30403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30419b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp Quantum 30423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scale; 30433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3044d7c4d1cebe0454ec33c82a85c86a2737fc0f2b41cristy scale = (Quantum) (65535UL)/((1UL << ping_file_depth)-1); 30450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 30469b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 30479b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp scale = ScaleShortToQuantum(scale); 30489b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp#endif 30490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3050bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 30513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 30523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].red=(Quantum) (i*scale); 30533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].green=(Quantum) (i*scale); 30543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colormap[i].blue=(Quantum) (i*scale); 30553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 30573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3058147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3059cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* Set some properties for reporting by "identify" */ 3060cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3061147bc91f6859c598c4f57b6a162111b2f63614d9glennrp char 3062151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy msg[MagickPathExtent]; 3063147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3064fcf06169b67cb58a2ab649c11889f91cb400dfd8glennrp /* encode ping_width, ping_height, ping_file_depth, ping_color_type, 3065147bc91f6859c598c4f57b6a162111b2f63614d9glennrp ping_interlace_method in value */ 3066147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3067151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 30687cdb11cd177ff29a9d2d8503ad4c920b404eade4glennrp "%d, %d",(int) ping_width, (int) ping_height); 30693398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:IHDR.width,height",msg,exception); 3070147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3071151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d",(int) ping_file_depth); 30723398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:IHDR.bit_depth",msg,exception); 3073147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3074151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d (%s)", 30755dff435eceea4f80207a906b11e65aed48fe3f27glennrp (int) ping_color_type, 30765dff435eceea4f80207a906b11e65aed48fe3f27glennrp Magick_ColorType_from_PNG_ColorType((int)ping_color_type)); 30773398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:IHDR.color_type",msg,exception); 3078147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 3079913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp if (ping_interlace_method == 0) 3080913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp { 3081151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d (Not interlaced)", 3082913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp (int) ping_interlace_method); 3083913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp } 3084913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp else if (ping_interlace_method == 1) 3085913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp { 3086151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d (Adam7 method)", 3087913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp (int) ping_interlace_method); 3088913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp } 3089913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp else 3090913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp { 3091151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d (Unknown method)", 3092913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp (int) ping_interlace_method); 3093913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp } 3094913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp (void) SetImageProperty(image,"png:IHDR.interlace_method",msg,exception); 3095913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp 3096913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp if (number_colors != 0) 3097913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp { 3098151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%d", 3099913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp (int) number_colors); 31003398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:PLTE.number_colors",msg, 3101913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp exception); 3102913f961818c9b07fd49b9167cbbd6620bbde52fcglennrp } 310339d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp } 3104fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 310539d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp read_tIME_chunk(image,ping,ping_info,exception); 3106fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 310739d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 3108147bc91f6859c598c4f57b6a162111b2f63614d9glennrp 31093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read image scanlines. 31113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay != 0) 31133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found++; 31140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31150ca69b143ae83fb90449a01e0b0900cb83a1cbc8glennrp if ((mng_info->mng_type == 0 && (image->ping != MagickFalse)) || ( 3116347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->number_scenes != 0) && (mng_info->scenes_found > (ssize_t) 3117347e40f2829bd04656674c58927cc50cda195475glennrp (image_info->first_scene+image_info->number_scenes)))) 31183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 31191b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp /* This happens later in non-ping decodes */ 31201b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 31211b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp image->storage_class=DirectClass; 31221b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp 31233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3125e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping PNG image data for scene %.20g",(double) 31263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found-1); 31273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 3128edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 3129868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3130cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3132edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 31333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()."); 31360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG IDAT chunk(s)"); 31430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 31450997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(image->rows,ping_rowbytes* 3146cf002022280cc4dedb2748ad6f415aac1d44f530glennrp sizeof(*ping_pixels)); 31470997332e2c35a821b271d6e7473c01c10dc206adcristy else 31480997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(ping_rowbytes,sizeof(*ping_pixels)); 31490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31500997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info == (MemoryInfo *) NULL) 3151edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 31520997332e2c35a821b271d6e7473c01c10dc206adcristy ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); 31530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Converting PNG pixels to pixel packets"); 31573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PNG pixels to pixel packets. 31593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31605f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 316116ea139d53d867211d3bb0fa859a83de653f687ecristy 316216ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info == (QuantumInfo *) NULL) 3163edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Failed to allocate quantum_info"); 31640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31654b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp (void) SetQuantumEndian(image,quantum_info,MSBEndian); 31664b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp 3167c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3168c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3169c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp MagickBooleanType 3170c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel; 3171c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3172c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel=MagickFalse; 3173c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 31743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 31753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3176c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (pass=0; pass < num_passes; pass++) 3177c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3178c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* 3179c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp Convert image to DirectClass pixel packets. 3180c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp */ 3181ccc36af759d30fb50b1deda241d038402a393b17glennrp image->alpha_trait= 3182ccc36af759d30fb50b1deda241d038402a393b17glennrp (((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 3183c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 3184c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 3185b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 31860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3187c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (y=0; y < (ssize_t) image->rows; y++) 3188c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3189c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (num_passes > 1) 3190c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=ping_rowbytes*y; 31910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3192c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 3193c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=0; 31940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3195cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 3196c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3197c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp if (pass < num_passes-1) 3198c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp continue; 3199c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3200862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 32013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 320216ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 3203c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 32040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 320516ea139d53d867211d3bb0fa859a83de653f687ecristy if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY) 320616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 320716ea139d53d867211d3bb0fa859a83de653f687ecristy GrayQuantum,ping_pixels+row_offset,exception); 32080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 320916ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 321016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 321116ea139d53d867211d3bb0fa859a83de653f687ecristy GrayAlphaQuantum,ping_pixels+row_offset,exception); 32120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 321316ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 321416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 321516ea139d53d867211d3bb0fa859a83de653f687ecristy RGBAQuantum,ping_pixels+row_offset,exception); 32160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 321716ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 321816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 321916ea139d53d867211d3bb0fa859a83de653f687ecristy IndexQuantum,ping_pixels+row_offset,exception); 32200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 322116ea139d53d867211d3bb0fa859a83de653f687ecristy else /* ping_color_type == PNG_COLOR_TYPE_RGB */ 322216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 322316ea139d53d867211d3bb0fa859a83de653f687ecristy RGBQuantum,ping_pixels+row_offset,exception); 32243faa9a3fb01696daaf976d595f492cb530bffb21glennrp 3225c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel == MagickFalse) 3226c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3227c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* Is there a transparent pixel in the row? */ 3228a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (y== 0 && logging != MagickFalse) 3229a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3230a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Looking for cheap transparent pixel"); 3231a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3232c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 3233c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 32345aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if ((ping_color_type == PNG_COLOR_TYPE_RGBA || 32355aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && 323616ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,q) != OpaqueAlpha)) 3237c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3238a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3239a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3240a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 3241a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3242c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel = MagickTrue; 3243c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3244c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32454f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((ping_color_type == PNG_COLOR_TYPE_RGB || 32464f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_color_type == PNG_COLOR_TYPE_GRAY) && 324716ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToShort(GetPixelRed(image,q)) == 324816ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 324916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 325016ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 325116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 325216ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue)) 32534f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 3254a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3255a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3256a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 32574f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp found_transparent_pixel = MagickTrue; 32584f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 32594f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 326016ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 3261c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3262c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3264af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes == 1) 3265c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3266af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 3267af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) y, image->rows); 32680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3269c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (status == MagickFalse) 3270c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3271c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3272c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 3273c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3274c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3276af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes != 1) 32777a287bfadeadea12e47c2376ca78a5d101687142cristy { 3278c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp status=SetImageProgress(image,LoadImageTag,pass,num_passes); 32797a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 32807a287bfadeadea12e47c2376ca78a5d101687142cristy break; 32817a287bfadeadea12e47c2376ca78a5d101687142cristy } 32823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 32853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* image->storage_class != DirectClass */ 3286c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 32873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 32883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 32893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Quantum 32903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_scanline; 32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register Quantum 32933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 32953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert grayscale image to PseudoClass pixel packets. 32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3298c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (logging != MagickFalse) 3299c17d96f447438bb27d874f1440ed05f6493fde1fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3300c17d96f447438bb27d874f1440ed05f6493fde1fglennrp " Converting grayscale pixels to pixel packets"); 330116ea139d53d867211d3bb0fa859a83de653f687ecristy 33028a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ? 3303b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 33040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) AcquireQuantumMemory(image->columns, 3306b0a657e13c4aefba39c51292005427b47277869dcristy (image->alpha_trait == BlendPixelTrait? 2 : 1)* 3307b0a657e13c4aefba39c51292005427b47277869dcristy sizeof(*quantum_scanline)); 33080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_scanline == (Quantum *) NULL) 3310edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 33110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3312bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 33133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33144f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp Quantum 33154f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha; 33164f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 3318faa852bad40107edae19405e76a299057668d795glennrp row_offset=ping_rowbytes*y; 3319c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 33203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 33213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset=0; 3322c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3323cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 3324c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3325c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp if (pass < num_passes-1) 3326c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp continue; 3327c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 33284f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 33290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 333016ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 33313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 33320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3333cf002022280cc4dedb2748ad6f415aac1d44f530glennrp p=ping_pixels+row_offset; 33343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 3335c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3336faa852bad40107edae19405e76a299057668d795glennrp switch (ping_bit_depth) 33373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 33393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33404f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 3341faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 3342bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3344a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 33454f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33464f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha=ScaleCharToQuantum((unsigned char)*p++); 33474f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33484f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp SetPixelAlpha(image,alpha,q); 33494f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33504f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp if (alpha != OpaqueAlpha) 33510b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 33524f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 335316ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 33543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 33550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3357bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3358a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 33590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 33613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 336247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 33643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3365bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3366a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp { 33679b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp#if (MAGICKCORE_QUANTUM_DEPTH >= 16) 336887281ec8d96ad26dfed9968c29b2920cb3d96744cristy unsigned short 336958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum; 337058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 337158f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (image->colors > 256) 3372c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 337358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 337458f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp else 3375c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 337658f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 337758f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum|=(*p++); 3378c17d96f447438bb27d874f1440ed05f6493fde1fglennrp *r=ScaleShortToQuantum(quantum); 337958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp r++; 33800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3381faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 33823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3383c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (image->colors > 256) 3384c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 3385c17d96f447438bb27d874f1440ed05f6493fde1fglennrp else 3386c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 3387c17d96f447438bb27d874f1440ed05f6493fde1fglennrp 3388c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum|=(*p++); 33894f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33904f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha=ScaleShortToQuantum(quantum); 33914f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp SetPixelAlpha(image,alpha,q); 33924f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33934f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp if (alpha != OpaqueAlpha) 339458f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp found_transparent_pixel = MagickTrue; 33954f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 339616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 339758f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp } 339858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 339958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp#else /* MAGICKCORE_QUANTUM_DEPTH == 8 */ 340058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp *r++=(*p++); 340158f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; /* strip low byte */ 340247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 340358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (ping_color_type == 4) 340458f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp { 340516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,*p++,q); 34064f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 340716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 34080b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 34094f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 341058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; 341116ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 34123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3414a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp } 341547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 341847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 34203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34223faa9a3fb01696daaf976d595f492cb530bffb21glennrp 34233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 34243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Transfer image scanline. 34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 34270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 342816ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 342916ea139d53d867211d3bb0fa859a83de653f687ecristy 343016ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 343116ea139d53d867211d3bb0fa859a83de653f687ecristy break; 3432bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 343316ea139d53d867211d3bb0fa859a83de653f687ecristy { 343416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,*r++,q); 343516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 343616ea139d53d867211d3bb0fa859a83de653f687ecristy } 34370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 34393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3441af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes == 1) 34427a287bfadeadea12e47c2376ca78a5d101687142cristy { 3443cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 34449fff7b4fa7d657da7bfed66239982b85c6337de9cristy image->rows); 344547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34467a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 34477a287bfadeadea12e47c2376ca78a5d101687142cristy break; 34487a287bfadeadea12e47c2376ca78a5d101687142cristy } 34493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3450c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3451af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes != 1) 34523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 345447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 34563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3458c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 34593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); 34603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3461c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3462b0a657e13c4aefba39c51292005427b47277869dcristy image->alpha_trait=found_transparent_pixel ? BlendPixelTrait : 3463b0a657e13c4aefba39c51292005427b47277869dcristy UndefinedPixelTrait; 3464c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3465c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 3466c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3467c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel != MagickFalse) 3468c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3469c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Found transparent pixel"); 3470c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 34715aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 34725aa37f69df93407ddf94afdfd2504f708d8b3242glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34735aa37f69df93407ddf94afdfd2504f708d8b3242glennrp " No transparent pixel was found"); 3474bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 34755aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type&=0x03; 34765aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 3477c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3478c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3479c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 348016ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info != (QuantumInfo *) NULL) 348116ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info=DestroyQuantumInfo(quantum_info); 348216ea139d53d867211d3bb0fa859a83de653f687ecristy 34835c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (image->storage_class == PseudoClass) 34845c6f789db7a30bad01ace12b09ad9cd471339e94cristy { 3485b0a657e13c4aefba39c51292005427b47277869dcristy PixelTrait 3486b0a657e13c4aefba39c51292005427b47277869dcristy alpha_trait; 34875c6f789db7a30bad01ace12b09ad9cd471339e94cristy 3488b0a657e13c4aefba39c51292005427b47277869dcristy alpha_trait=image->alpha_trait; 34898a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 349016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 3491b0a657e13c4aefba39c51292005427b47277869dcristy image->alpha_trait=alpha_trait; 34925c6f789db7a30bad01ace12b09ad9cd471339e94cristy } 349347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34944eb3931feb349dd87142c78503b779228f3e1a0fglennrp png_read_end(ping,end_info); 34953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3496ccc36af759d30fb50b1deda241d038402a393b17glennrp if (logging != MagickFalse) 3497ccc36af759d30fb50b1deda241d038402a393b17glennrp { 3498ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3499ccc36af759d30fb50b1deda241d038402a393b17glennrp " image->storage_class=%d\n",(int) image->storage_class); 3500ccc36af759d30fb50b1deda241d038402a393b17glennrp } 3501ccc36af759d30fb50b1deda241d038402a393b17glennrp 35023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0 && mng_info->scenes_found-1 < 3503bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) image_info->first_scene && image->delay != 0) 35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 35060997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 35073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 350816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 3509868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3510cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 35123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() early."); 35153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 351747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3518faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 35193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ClassType 35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class; 35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image has a transparent background. 35253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class=image->storage_class; 35278a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 3528c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35293c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp/* Balfour fix from imagemagick discourse server, 5 Feb 2010 */ 3530c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (storage_class == PseudoClass) 35320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 3534c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 35350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < ping_num_trans; x++) 35360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35378a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->colormap[x].alpha_trait=BlendPixelTrait; 353816ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = 353916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((unsigned char)ping_trans_alpha[x]); 35400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3541c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 354247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 35430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY) 35440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < (int) image->colors; x++) 35460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ScaleQuantumToShort(image->colormap[x].red) == 354816ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha) 35490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35508a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->colormap[x].alpha_trait=BlendPixelTrait; 355116ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = (Quantum) TransparentAlpha; 35520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 35530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 35540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 355516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 35560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 355747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3558a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if 1 /* Should have already been done above, but glennrp problem P10 3559a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * needs this. 3560a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 35610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 35620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (y=0; y < (ssize_t) image->rows; y++) 35640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->storage_class=storage_class; 35660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 3567c11cf6a442f3046940608a5743a68cc891deb13eglennrp 356816ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 35690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3570c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3572a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp /* Caution: on a Q8 build, this does not distinguish between 3573a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * 16-bit colors that differ only in the low byte 3574a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 35750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 35760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 357716ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToShort(GetPixelRed(image,q)) == 357816ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 357916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 358016ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 358116ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 358216ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue) 35834f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 358416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,q); 35854f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 35860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 358767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if 0 /* I have not found a case where this is needed. */ 35880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 35894f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 359016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,q)=(Quantum) OpaqueAlpha; 35914f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 3592a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 35930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 359416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 35950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 35960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 35970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 35980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3599c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 36000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3601a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 3602c11cf6a442f3046940608a5743a68cc891deb13eglennrp 36033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=DirectClass; 36043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36053c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 3606eb3b22a03f31af7f724573d8537cd91fca06ee41cristy for (j = 0; j < 2; j++) 36074eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36084eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (j == 0) 3609a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,ping_info,&text,&num_text) != 0 ? 3610a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 36114eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 3612a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,end_info,&text,&num_text) != 0 ? 3613a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 36143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36154eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (status != MagickFalse) 36164eb3931feb349dd87142c78503b779228f3e1a0fglennrp for (i=0; i < (ssize_t) num_text; i++) 36174eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36184eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Check for a profile */ 36190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36204eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 36214eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 36224eb3931feb349dd87142c78503b779228f3e1a0fglennrp " Reading PNG text chunk"); 36230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36245285ae1de367013bf70a5a4e5feaefe3de8dda7bglennrp if (strlen(text[i].key) > 16 && 36256dfc26699a1aacdec9771115c4dcaf6c5c0a8f98glennrp memcmp(text[i].key, "Raw profile type ",17) == 0) 36264eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 362799f968111025b4fadb966ca482c6f57750bf007bglennrp const char 362899f968111025b4fadb966ca482c6f57750bf007bglennrp *value; 362999f968111025b4fadb966ca482c6f57750bf007bglennrp 363099f968111025b4fadb966ca482c6f57750bf007bglennrp value=GetImageOption(image_info,"profile:skip"); 363199f968111025b4fadb966ca482c6f57750bf007bglennrp 363299f968111025b4fadb966ca482c6f57750bf007bglennrp if (IsOptionMember(text[i].key+17,value) == MagickFalse) 363399f968111025b4fadb966ca482c6f57750bf007bglennrp { 363499f968111025b4fadb966ca482c6f57750bf007bglennrp (void) Magick_png_read_raw_profile(ping,image,image_info,text, 363599f968111025b4fadb966ca482c6f57750bf007bglennrp (int) i,exception); 363699f968111025b4fadb966ca482c6f57750bf007bglennrp num_raw_profiles++; 363799f968111025b4fadb966ca482c6f57750bf007bglennrp if (logging != MagickFalse) 363899f968111025b4fadb966ca482c6f57750bf007bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 363999f968111025b4fadb966ca482c6f57750bf007bglennrp " Read raw profile %s",text[i].key+17); 364099f968111025b4fadb966ca482c6f57750bf007bglennrp } 364199f968111025b4fadb966ca482c6f57750bf007bglennrp else 364299f968111025b4fadb966ca482c6f57750bf007bglennrp { 364399f968111025b4fadb966ca482c6f57750bf007bglennrp if (logging != MagickFalse) 364499f968111025b4fadb966ca482c6f57750bf007bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 364599f968111025b4fadb966ca482c6f57750bf007bglennrp " Skipping raw profile %s",text[i].key+17); 364699f968111025b4fadb966ca482c6f57750bf007bglennrp } 36474eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36484eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36494eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 36504eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36514eb3931feb349dd87142c78503b779228f3e1a0fglennrp char 36524eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value; 36534eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36544eb3931feb349dd87142c78503b779228f3e1a0fglennrp length=text[i].text_length; 3655151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy value=(char *) AcquireQuantumMemory(length+MagickPathExtent, 36564eb3931feb349dd87142c78503b779228f3e1a0fglennrp sizeof(*value)); 36574eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (value == (char *) NULL) 36584eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3659edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 36604eb3931feb349dd87142c78503b779228f3e1a0fglennrp break; 36614eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36624eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value='\0'; 36634eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) ConcatenateMagickString(value,text[i].text,length+2); 36644eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36654eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Don't save "density" or "units" property if we have a pHYs 36664eb3931feb349dd87142c78503b779228f3e1a0fglennrp * chunk 36674eb3931feb349dd87142c78503b779228f3e1a0fglennrp */ 36684eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs) || 36694eb3931feb349dd87142c78503b779228f3e1a0fglennrp (LocaleCompare(text[i].key,"density") != 0 && 36704eb3931feb349dd87142c78503b779228f3e1a0fglennrp LocaleCompare(text[i].key,"units") != 0)) 367116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,text[i].key,value,exception); 36723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36734eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 36743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36754eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 36762dd1906783a5ece58a6105b4f59239e28b13caddglennrp " length: %lu\n" 36772dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Keyword: %s", 36782dd1906783a5ece58a6105b4f59239e28b13caddglennrp (unsigned long) length, 36792dd1906783a5ece58a6105b4f59239e28b13caddglennrp text[i].key); 36803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36824eb3931feb349dd87142c78503b779228f3e1a0fglennrp value=DestroyString(value); 368397f90e23c85b9c58387880125c29d8c99126f83aglennrp } 36844eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 3685fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk num_text_total += num_text; 3686fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 36873c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 36883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 36903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Store the object if necessary. 36913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 36923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id && !mng_info->frozen[object_id]) 36933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 36953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy create a new object buffer. 36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]=(MngBuffer *) 370073bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(MngBuffer)); 37010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] != (MngBuffer *) NULL) 37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=(Image *) NULL; 37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->reference_count=1; 37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 370847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->ob[object_id] == (MngBuffer *) NULL) || 37103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->frozen) 37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 3713edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 37140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->frozen) 3716edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Cannot overwrite frozen MNG object buffer"); 37173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 37233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=DestroyImage 37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->ob[object_id]->image); 37250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=CloneImage(image,0,0,MagickTrue, 372716ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 37280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image->file=(FILE *) NULL; 37310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3733edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cloning image for object buffer failed"); 37340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3735faa852bad40107edae19405e76a299057668d795glennrp if (ping_width > 250000L || ping_height > 250000L) 37363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping,"PNG Image dimensions are too large."); 37370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3738faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->width=ping_width; 3739faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->height=ping_height; 3740faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->color_type=ping_color_type; 3741faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->sample_depth=ping_bit_depth; 3742faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->interlace_method=ping_interlace_method; 3743faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->compression_method= 3744faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method; 3745faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->filter_method=ping_filter_method; 37460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3747faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 37483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 37503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte; 37513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy the PLTE to the object buffer. 37543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_get_PLTE(ping,ping_info,&plte,&number_colors); 37563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=number_colors; 37573c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte[i]=plte[i]; 37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 376347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=0; 37663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 37690a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 37708a46d827a124555f0c48fb2368ec1bba8e079ab6cristy /* Set image->alpha_trait to MagickTrue if the input colortype supports 37710a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * alpha or if a valid tRNS chunk is present, no matter whether there 37720a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * is actual transparency present. 37730a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp */ 37748a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 37750a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 37760a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 3777b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 37780a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 3779224ad8d90905c1c81d949c30e4a808246b4d5165glennrp#if 0 /* I'm not sure what's wrong here but it does not work. */ 378017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 37815830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 37825830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 3783def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,GrayscaleAlphaType,exception); 37845830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37855830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 3786def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,PaletteAlphaType,exception); 37875830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37885830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 3789def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 37905830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 37915830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37925830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 37935830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 37945830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 37955830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,GrayscaleType,exception); 37965830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37975830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 37985830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,PaletteType,exception); 37995830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 38005830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 38015830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,TrueColorType,exception); 38025830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 3803224ad8d90905c1c81d949c30e4a808246b4d5165glennrp#endif 38045830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 3805cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* Set more properties for identify to retrieve */ 3806cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3807cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp char 3808151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy msg[MagickPathExtent]; 3809cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38104eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (num_text_total != 0) 3811cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3812cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* libpng doesn't tell us whether they were tEXt, zTXt, or iTXt */ 3813151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 3814613276d97a7f0e40c1055f9ff5ddfcfa8896e20bglennrp "%d tEXt/zTXt/iTXt chunks were found", num_text_total); 38153398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:text",msg, 381616ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3817cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3818cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3819cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (num_raw_profiles != 0) 3820cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3821151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 3822cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp "%d were found", num_raw_profiles); 382316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:text-encoded profiles",msg, 382416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3825cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3826cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 382798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_cHRM != MagickFalse) 38285961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 3829151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38305961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Chromaticity, above)"); 38313398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:cHRM",msg, 383216ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38335961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 3834cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3835cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 38365961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 3837151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38385961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Background color, above)"); 38393398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:bKGD",msg, 384016ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38415961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 38425961225e531a5f26ae179c1d919582d5cdaa44bbglennrp 3843151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38445961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found"); 3845cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 384698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp#if defined(PNG_iCCP_SUPPORTED) 384798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_iCCP != MagickFalse) 38483398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:iCCP",msg, 384916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 385098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp#endif 3851cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38524eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 38533398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:tRNS",msg, 385416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38554eb3931feb349dd87142c78503b779228f3e1a0fglennrp 38564eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_sRGB_SUPPORTED) 385798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_sRGB != MagickFalse) 38584eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3859151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 386098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp "intent=%d (%s)", 386198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (int) intent, 386298b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp Magick_RenderingIntentString_from_PNG_RenderingIntent(intent)); 38633398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:sRGB",msg, 386498b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp exception); 38654eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 38664eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 38674eb3931feb349dd87142c78503b779228f3e1a0fglennrp 386898b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_gAMA != MagickFalse) 38694eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3870151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 387116ea139d53d867211d3bb0fa859a83de653f687ecristy "gamma=%.8g (See Gamma, above)", 387216ea139d53d867211d3bb0fa859a83de653f687ecristy file_gamma); 38733398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:gAMA",msg, 387416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38754eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 3876cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38774eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_pHYs_SUPPORTED) 3878cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 38794eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3880151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 388107523c7d2e40370804c2036295571e4b6426f94dglennrp "x_res=%.10g, y_res=%.10g, units=%d", 38824eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) x_resolution,(double) y_resolution, unit_type); 38833398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:pHYs",msg, 388416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38854eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 38864eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 3887cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38884eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_oFFs_SUPPORTED) 38894eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 38904eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3891151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"x_off=%.20g, y_off=%.20g", 38924eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) image->page.x,(double) image->page.y); 38933398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:oFFs",msg, 389416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38954eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 38964eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 38974eb3931feb349dd87142c78503b779228f3e1a0fglennrp 3898fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 3899fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk read_tIME_chunk(image,ping,end_info,exception); 3900fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 3901fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 390207523c7d2e40370804c2036295571e4b6426f94dglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 390307523c7d2e40370804c2036295571e4b6426f94dglennrp (image->page.height != 0 && image->page.height != image->rows)) 390407523c7d2e40370804c2036295571e4b6426f94dglennrp { 3905151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 390607523c7d2e40370804c2036295571e4b6426f94dglennrp "width=%.20g, height=%.20g", 390707523c7d2e40370804c2036295571e4b6426f94dglennrp (double) image->page.width,(double) image->page.height); 39083398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:vpAg",msg, 390916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 391007523c7d2e40370804c2036295571e4b6426f94dglennrp } 3911cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3912cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 39133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 39153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 39173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39180997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 39193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()"); 39230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3924868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3925edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 3926edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 3927edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 3928edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block, revert to 3929edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 3930edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 3931edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 39323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 39333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* end of reading one PNG image */ 39353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 39363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39373ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 39383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 39393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 3940919429921a43880a338ed87e128d3b96219442efglennrp *image; 39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 394321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 394421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 39493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 3951151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 39523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 3960e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 396147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 396547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 3967e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 3968fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadPNGImage()"); 396916ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 39703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 397247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 39743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(FileOpenError,"UnableToOpenFile"); 397547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify PNG signature. 39783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,8,(unsigned char *) magic_number); 398047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3981dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp if (count < 8 || memcmp(magic_number,"\211PNG\r\n\032\n",8) != 0) 39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 398347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 398873bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 398947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 399247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 39973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 39983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 40013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 400247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error"); 40080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 401147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 401347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns == 0) || (image->rows == 0)) 40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error."); 40190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 402247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 402372715f5c299a6482f8eb175070b056d77b74a43fcristy if ((IssRGBColorspace(image->colorspace) != MagickFalse) && 40243d627862fb79aad8a20be4f1587f0b8761db441aglennrp ((image->gamma < .45) || (image->gamma > .46)) && 40253d627862fb79aad8a20be4f1587f0b8761db441aglennrp !(image->chromaticity.red_primary.x>0.6399f && 40263d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.x<0.6401f && 40273d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y>0.3299f && 40283d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y<0.3301f && 40293d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x>0.2999f && 40303d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x<0.3001f && 40313d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y>0.5999f && 40323d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y<0.6001f && 40333d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x>0.1499f && 40343d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x<0.1501f && 40353d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y>0.0599f && 40363d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y<0.0601f && 40373d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x>0.3126f && 40383d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x<0.3128f && 40393d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y>0.3289f && 40403d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y<0.3291f)) 4041ccc36af759d30fb50b1deda241d038402a393b17glennrp { 4042ccc36af759d30fb50b1deda241d038402a393b17glennrp SetImageColorspace(image,RGBColorspace,exception); 4043ccc36af759d30fb50b1deda241d038402a393b17glennrp } 404472715f5c299a6482f8eb175070b056d77b74a43fcristy 40453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 4046ccc36af759d30fb50b1deda241d038402a393b17glennrp { 4047ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4048ccc36af759d30fb50b1deda241d038402a393b17glennrp " page.w: %.20g, page.h: %.20g,page.x: %.20g, page.y: %.20g.", 4049ccc36af759d30fb50b1deda241d038402a393b17glennrp (double) image->page.width,(double) image->page.height, 4050ccc36af759d30fb50b1deda241d038402a393b17glennrp (double) image->page.x,(double) image->page.y); 4051ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4052ccc36af759d30fb50b1deda241d038402a393b17glennrp " image->colorspace: %d", (int) image->colorspace); 4053ccc36af759d30fb50b1deda241d038402a393b17glennrp } 405497f90e23c85b9c58387880125c29d8c99126f83aglennrp 405597f90e23c85b9c58387880125c29d8c99126f83aglennrp if (logging != MagickFalse) 40563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadPNGImage()"); 40570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 40593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 40603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 40643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e J N G I m a g e % 40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOneJNGImage() reads a JPEG Network Graphics (JNG) image file 40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 40773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOneJNGImage method is: 40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOneJNGImage(MngInfo *mng_info, const ImageInfo *image_info, 40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 40943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneJNGImage(MngInfo *mng_info, 40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image, 41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image, 41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jng_image; 41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image_info, 41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image_info; 41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41094383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 41104383ec8c3c8811128f5a8a034d67c47db5e7e75acristy logging; 41114383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 4112bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 41193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height, 41203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width; 41213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth, 41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method, 41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method, 41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method, 41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method; 41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 413216ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *s; 41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4135bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 413916ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 41413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 41443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP, 4147e0421fec74bee9a6f9def3d51aed4204f970ad73glennrp reading_idat; 41483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4149bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=0; 41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=0; 41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height=0; 41563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width=0; 41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=(Image *) NULL; 41583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=(Image *) NULL; 41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) NULL; 41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=(ImageInfo *) NULL; 41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 4163fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter ReadOneJNGImage()"); 41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 41660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 416716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " AcquireNextImage()"); 41750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 417616ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 41770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 41793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 41800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 41843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Signature bytes have already been read. 41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickFalse; 41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickFalse; 41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (;;) 41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4194151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy type[MagickPathExtent]; 41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 42033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new JNG chunk. 42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 42070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 42100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 4212151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(type,"errr",MagickPathExtent); 42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(unsigned int) ReadBlob(image,4,(unsigned char *) type); 42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4218e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading JNG chunk type %c%c%c%c, length: %.20g", 4219e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 42203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX || count == 0) 42226af512ae5eeeed8effd9af4d57aab7caf74c65eddirk ThrowReaderException(CorruptImageError,"CorruptImage"); 42230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 42253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 422647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42278fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 42283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 42300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 42323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 42330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4234bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 42353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 42360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 423947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 42433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 16) 42453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4246bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 4247e2440c250d94d64f8c70e596fe90808795aaa07ecristy (p[2] << 8) | p[3]); 4248bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 4249e2440c250d94d64f8c70e596fe90808795aaa07ecristy (p[6] << 8) | p[7]); 4250e2440c250d94d64f8c70e596fe90808795aaa07ecristy if ((jng_width == 0) || (jng_height == 0)) 4251e2440c250d94d64f8c70e596fe90808795aaa07ecristy ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); 42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=p[8]; 42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth=p[9]; 42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method=p[10]; 42553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method=p[11]; 425647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->interlace=jng_image_interlace_method != 0 ? PNGInterlace : 42583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NoInterlace; 425947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=p[12]; 42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=p[13]; 42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method=p[14]; 42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method=p[15]; 426447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42682dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_width: %16lu, jng_height: %16lu\n" 42692dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_color_type: %16d, jng_image_sample_depth: %3d\n" 42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_compression_method:%3d", 42712dd1906783a5ece58a6105b4f59239e28b13caddglennrp (unsigned long) jng_width, (unsigned long) jng_height, 42722dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_color_type, jng_image_sample_depth, 42733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method); 427447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42762dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_image_interlace_method: %3d" 42773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_sample_depth: %3d", 42782dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_image_interlace_method, 42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth); 428047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42822dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_alpha_compression_method:%3d\n" 42832dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_alpha_filter_method: %3d\n" 42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_interlace_method: %3d", 42852dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_alpha_compression_method, 42862dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_alpha_filter_method, 42873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method); 42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 429047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42918fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 42923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 429347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 42953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((reading_idat == MagickFalse) && (read_JSEP == MagickFalse) && 42993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((memcmp(type,mng_JDAT,4) == 0) || (memcmp(type,mng_JdAA,4) == 0) || 43003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (memcmp(type,mng_IDAT,4) == 0) || (memcmp(type,mng_JDAA,4) == 0))) 43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o create color_image 43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o open color_blob, attached to color_image 43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color type has alpha) 43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy open alpha_blob, attached to alpha_image 43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 430973bd4a51b419e914565bdf204bf1540dc4c8ee26cristy color_image_info=(ImageInfo *)AcquireMagickMemory(sizeof(ImageInfo)); 431047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image_info == (ImageInfo *) NULL) 43123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 431347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(color_image_info); 431516ea139d53d867211d3bb0fa859a83de653f687ecristy color_image=AcquireImage(color_image_info,exception); 43160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image == (Image *) NULL) 43183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 43193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating color_blob."); 43230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(color_image->filename); 43253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(color_image_info,color_image,WriteBinaryBlobMode, 43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 43270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping == MagickFalse) && (jng_color_type >= 12)) 43323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) 433473bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(ImageInfo)); 43350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image_info == (ImageInfo *) NULL) 43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 43380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(alpha_image_info); 434016ea139d53d867211d3bb0fa859a83de653f687ecristy alpha_image=AcquireImage(alpha_image_info,exception); 43410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image == (Image *) NULL) 43433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 43473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating alpha_blob."); 43520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(alpha_image->filename); 43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(alpha_image_info,alpha_image,WriteBinaryBlobMode, 43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 43560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 43583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 43590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 43613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[18]; 43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing IHDR chunk to alpha_blob."); 43680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,8,(const unsigned char *) 43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "\211PNG\r\n\032\n"); 43710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,13L); 43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IHDR); 437403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IHDR,13L); 43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+4,jng_width); 43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+8,jng_height); 43773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[12]=jng_alpha_sample_depth; 43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[13]=0; /* color_type gray */ 43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[14]=0; /* compression method 0 */ 43803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[15]=0; /* filter_method 0 */ 43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[16]=0; /* interlace_method 0 */ 43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,17,data); 43833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,17)); 43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickTrue; 43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JDAT,4) == 0) 43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 439147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk to color_image->blob */ 43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAT chunk data to color_blob."); 43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(color_image,length,chunk); 439847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43998fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 440147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IDAT,4) == 0) 44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 44083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 441047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy IDAT header and chunk data to alpha_image->blob */ 44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4412889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (alpha_image != NULL && image_info->ping == MagickFalse) 44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying IDAT chunk data to alpha_blob."); 44173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4418bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(alpha_image,(size_t) length); 44193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IDAT); 442003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IDAT,length); 44213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 44233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image, 44243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(crc32(0,data,4),chunk,(uInt) length)); 44253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44278fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_JDAA,4) == 0) || (memcmp(type,mng_JdAA,4) == 0)) 44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 443547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk data to alpha_image->blob */ 44363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4437889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (alpha_image != NULL && image_info->ping == MagickFalse) 44383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAA chunk data to alpha_blob."); 44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 44443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44468fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JSEP,4) == 0) 44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickTrue; 44550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44568fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 2) 44653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 44673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=image->background_color.red; 44683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=image->background_color.red; 44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 6) 44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=ScaleCharToQuantum(p[3]); 44753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=ScaleCharToQuantum(p[5]); 44763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 44858182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->gamma=((float) mng_get_long(p))*0.00001; 44860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 44943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44958182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.x=0.00001*mng_get_long(p); 44968182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.y=0.00001*mng_get_long(&p[4]); 44978182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.x=0.00001*mng_get_long(&p[8]); 44988182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.y=0.00001*mng_get_long(&p[12]); 44998182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.x=0.00001*mng_get_long(&p[16]); 45008182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.y=0.00001*mng_get_long(&p[20]); 45018182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.x=0.00001*mng_get_long(&p[24]); 45028182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.y=0.00001*mng_get_long(&p[28]); 45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 450447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 45103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 1) 45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4513e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent= 4514cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 4515da7803d6b1161960bc1e7db4d9718284c116fab8cristy image->gamma=1.000f/2.200f; 45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x=0.6400f; 45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y=0.3300f; 45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x=0.3000f; 45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y=0.6000f; 45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x=0.1500f; 45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y=0.0600f; 45223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x=0.3127f; 45233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.y=0.3290f; 45243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 452547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_oFFs,4) == 0) 45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45345eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.x=(ssize_t) mng_get_long(p); 45355eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.y=(ssize_t) mng_get_long(&p[4]); 45360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] != 0) 45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x/=10000; 45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y/=10000; 45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 454347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45448fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 45533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 455416ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) mng_get_long(p); 455516ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) mng_get_long(&p[4]); 45563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] == PNG_RESOLUTION_METER) 45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 455916ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=image->resolution.x/100.0f; 456016ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=image->resolution.y/100.0f; 45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0 45693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4571fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 45728fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45798fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4)) 45833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* IEND found */ 45903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finish up reading image data: 45933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o read main image from color_blob. 45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close color_blob. 45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color_type has alpha) 45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is PNG 46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadPNG 46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is JPEG 46023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadJPEG 46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close alpha_blob. 46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o copy intensity of secondary image into 460716ea139d53d867211d3bb0fa859a83de653f687ecristy alpha samples of main image. 46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o destroy the secondary image. 46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4612325657913840de53be706fb11ec48ba11b53e808Cristy if (color_image_info == (ImageInfo *) NULL) 4613325657913840de53be706fb11ec48ba11b53e808Cristy { 4614325657913840de53be706fb11ec48ba11b53e808Cristy assert(color_image == (Image *) NULL); 4615325657913840de53be706fb11ec48ba11b53e808Cristy assert(alpha_image == (Image *) NULL); 4616325657913840de53be706fb11ec48ba11b53e808Cristy return((Image *) NULL); 4617325657913840de53be706fb11ec48ba11b53e808Cristy } 4618325657913840de53be706fb11ec48ba11b53e808Cristy 4619325657913840de53be706fb11ec48ba11b53e808Cristy if (color_image == (Image *) NULL) 4620325657913840de53be706fb11ec48ba11b53e808Cristy { 4621325657913840de53be706fb11ec48ba11b53e808Cristy assert(alpha_image == (Image *) NULL); 4622325657913840de53be706fb11ec48ba11b53e808Cristy return((Image *) NULL); 4623325657913840de53be706fb11ec48ba11b53e808Cristy } 4624325657913840de53be706fb11ec48ba11b53e808Cristy 4625325657913840de53be706fb11ec48ba11b53e808Cristy (void) SeekBlob(color_image,0,SEEK_SET); 4626325657913840de53be706fb11ec48ba11b53e808Cristy 46273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading jng_image from color_blob."); 46300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4631f0eec7524321f1be1bfe568a13ab7d4d0333c814cristy assert(color_image_info != (ImageInfo *) NULL); 4632151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(color_image_info->filename,MagickPathExtent,"%s", 46333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image->filename); 46340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info->ping=MagickFalse; /* To do: avoid this */ 46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(color_image_info,exception); 46370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(color_image->filename); 46393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=DestroyImage(color_image); 46403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=DestroyImageInfo(color_image_info); 46413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 46433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying jng_image pixels to main image."); 46480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=jng_height; 46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=jng_width; 46510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4652bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 465416ea139d53d867211d3bb0fa859a83de653f687ecristy s=GetVirtualPixels(jng_image,0,y,image->columns,1,exception); 46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 465616ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 465716ea139d53d867211d3bb0fa859a83de653f687ecristy { 465816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(jng_image,s),q); 465916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(jng_image,s),q); 466016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(jng_image,s),q); 466116ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 466216ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 466316ea139d53d867211d3bb0fa859a83de653f687ecristy } 466447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 46673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 46700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 46723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type >= 12) 46743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 46763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,0x00000000L); 46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IEND); 468103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0L); 46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 46833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,4)); 46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(alpha_image); 46870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 469016ea139d53d867211d3bb0fa859a83de653f687ecristy " Reading alpha from alpha_blob."); 46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4692151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(alpha_image_info->filename,MagickPathExtent, 46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",alpha_image->filename); 46943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(alpha_image_info,exception); 46960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 4698bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s=GetVirtualPixels(jng_image,0,y,image->columns,1, 470116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 470347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 470417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 470516ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 470616ea139d53d867211d3bb0fa859a83de653f687ecristy { 470716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 470816ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 470916ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 471016ea139d53d867211d3bb0fa859a83de653f687ecristy } 47110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 471316ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 47143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 471516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 471616ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 47178a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 471816ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 471916ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 47203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 47233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 47243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(alpha_image->filename); 47263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=DestroyImageInfo(alpha_image_info); 47283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 47293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 47303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 473347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read the JNG image. */ 473447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_width=jng_width; 47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_height=jng_height; 47393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.width == 0 && image->page.height == 0) 47420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.width=jng_width; 47440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.height=jng_height; 47450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x == 0 && image->page.y == 0) 47480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.x=mng_info->x_off[mng_info->object_id]; 47500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 47510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 47540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 47560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 47593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,2*TellBlob(image), 47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 47610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 476244c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 476344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp return((Image *) NULL); 476444c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 47653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 47673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOneJNGImage()"); 47680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 47703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 47743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d J N G I m a g e % 47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadJNGImage() reads a JPEG Network Graphics (JNG) image file 47843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (including the 8-byte signature) and returns it. It allocates the memory 47853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 47893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadJNGImage method is: 47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadJNGImage(const ImageInfo *image_info, ExceptionInfo 47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% *exception) 47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadJNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 48067ee973a2149db53911459cbf26f28eccdbc99efbglennrp *image; 48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 480921f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 481021f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4817151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 48233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 4826e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 4829e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 4830fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadJNGImage()"); 483116ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 48340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 48370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"JNG") != 0) 48393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 48400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 484147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify JNG signature. */ 484247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 484447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48453b8763efd02f5343a141d40636f6a8dfdc2c7682glennrp if (count < 8 || memcmp(magic_number,"\213JNG\r\n\032\n",8) != 0) 48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 48470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 484847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 484947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 485173bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(*mng_info)); 48520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 48543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 48550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 485647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 485747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 48603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 48623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 48640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 48693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 48700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 487447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 48763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 48800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadJNGImage()"); 48860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 48933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4894151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy page_geometry[MagickPathExtent]; 48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 4897889a928b732161b6353bd880e5ea0802f184c6d4glennrp *image; 48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48994383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 490021f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 490121f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure; 49024383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object, 49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found, 49073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4909bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile ssize_t 49103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 49133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 49143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 49223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb, 49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb, 49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb; 49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 492716ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color; 49293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4934bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4940bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 49413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level; 49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile short 49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop; 49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 49533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=0, 49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; /* 0: PNG or JNG; 1: MNG; 2: MNG-LC; 3: MNG-VLC */ 49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4957bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout, 49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout, 49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_height, 49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_width, 49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 496638ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp /* These delays are all measured in image ticks_per_second, 496738ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp * not in MNG ticks_per_second 496838ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp */ 4969bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 49703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay, 49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay, 49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay, 49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay, 49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers, 49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=1, 49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0, 49793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_height=0, 49803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_width=0; 49813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.top=0; 49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.bottom=0; 49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.left=0; 49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.right=0; 49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.top=0; 49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.bottom=0; 49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.left=0; 49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.right=0; 49903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 499147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Open image file. */ 499247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 4994e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 4997e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 4998fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadMNGImage()"); 499916ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 50020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 50043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 50050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 50073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 500947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 501047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 501147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 501273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 50130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 50153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 50160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 501747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 501847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 50223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 50243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 5026151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 502847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify MNG signature. */ 50293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 50303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\212MNG\r\n\032\n",8) != 0) 50313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 503247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 503347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize some nonzero members of the MngInfo structure. */ 50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5036bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 5037bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[0]=MagickTrue; 50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 504147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickTrue; 50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; 50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickFalse; /* should be False when converting or mogrifying */ 50463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=0; 50493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=0; 50503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1; 50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=0; 50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 50543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=MagickFalse; 50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color=image->background_color; 50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=mng_info->frame; 50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=mng_info->frame; 50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 5067151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy type[MagickPathExtent]; 50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new chunk. 50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 5078151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(type,"errr",MagickPathExtent); 50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 50803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,4,(unsigned char *) type); 50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5084e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading MNG chunk type %c%c%c%c, length: %.20g", 5085e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX) 508844c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp { 508944c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp status=MagickFalse; 509044c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp break; 509144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp } 50920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (count == 0) 50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 50950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 50973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 50980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50998fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 510247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 51043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 510547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5106bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 510847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 51103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(JNG_SUPPORTED) 51153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 51180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->jhdr_warning == 0) 512016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 51213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"JNGCompressNotSupported","`%s'",image->filename); 51220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->jhdr_warning++; 51243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DHDR,4) == 0) 51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 51290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->dhdr_warning == 0) 513116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DeltaPNGNotSupported","`%s'",image->filename); 51330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->dhdr_warning++; 51353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MEND,4) == 0) 51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 513847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4) == 0) 51423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 51430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51448fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 51460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skip to IEND."); 51500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MHDR,4) == 0) 51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5156f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length != 28) 5157f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy { 5158f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (chunk) 5159f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 5160f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy ThrowReaderException(CorruptImageError,"CorruptImage"); 5161f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy } 5162f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy 5163bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 51650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5166bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 51680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5172e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG width: %.20g",(double) mng_info->mng_width); 51733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5174e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG height: %.20g",(double) mng_info->mng_height); 51753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=8; 51788182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->ticks_per_second=(size_t) mng_get_long(p); 51790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second == 0) 51813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 51820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=1UL*image->ticks_per_second/ 51853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second; 51860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0; 51890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5190f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy p+=16; 5191f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy simplicity=(size_t) mng_get_long(p); 51920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=1; /* Full MNG */ 51940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 11) == 11)) 51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=2; /* LC */ 51970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 9) == 9)) 51993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=3; /* VLC */ 52000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 52023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type != 3) 52033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickTrue; 52043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 520516ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 520747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 520816ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 52090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 52120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->mng_width > 65535L) || 52183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height > 65535L)) 52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); 52200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5221151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(page_geometry,MagickPathExtent, 5222e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "%.20gx%.20g+0+0",(double) mng_info->mng_width,(double) 5223f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->mng_height); 52240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.left=0; 5226bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.right=(ssize_t) mng_info->mng_width; 52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.top=0; 5228bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.bottom=(ssize_t) mng_info->mng_height; 52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=default_fb=previous_fb=mng_info->frame; 52300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_info->frame; 52330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_TERM,4) == 0) 52393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 52413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=0; 52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52438fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=p[0]; 52450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (repeat == 3) 52473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52488182b0758e3429fb8dcd1700f09643fd4d80a41ccristy final_delay=(png_uint_32) mng_get_long(&p[2]); 52498182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_iterations=(png_uint_32) mng_get_long(&p[6]); 52500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == PNG_UINT_31_MAX) 52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=0; 52530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickTrue; 52563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5261280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " repeat=%d, final_delay=%.20g, iterations=%.20g", 5262280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp repeat,(double) final_delay, (double) image->iterations); 52633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DEFI,4) == 0) 52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 527116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DEFI chunk found in MNG-VLC datastream","`%s'", 52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 52740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5275f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length < 2) 5276f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy { 5277f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (chunk) 5278f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 5279f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy ThrowReaderException(CorruptImageError,"CorruptImage"); 5280f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy } 5281f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy 52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=(p[0] << 8) | p[1]; 52830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 2 && object_id != 0) 528516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Nonzero object_id in MNG-LC datastream","`%s'", 52873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 52880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id > MNG_MAX_OBJECTS) 52903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5292edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp Instead of using a warning we should allocate a larger 52933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo structure and continue. 52943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 529516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 52963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"object id too large","`%s'",image->filename); 52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=MNG_MAX_OBJECTS; 52983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[object_id]) 53013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->frozen[object_id]) 53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 530416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 53053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "DEFI cannot redefine a frozen MNG object","`%s'", 53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 53083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 53120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 2) 53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[object_id]=p[2]; 53150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object offset info. 53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->x_off[object_id]=(ssize_t) ((p[4] << 24) | 53220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[5] << 16) | (p[6] << 8) | p[7]); 53230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->y_off[object_id]=(ssize_t) ((p[8] << 24) | 53250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[9] << 16) | (p[10] << 8) | p[11]); 53260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5330280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " x_off[%d]: %.20g, y_off[%d]: %.20g", 5331280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp object_id,(double) mng_info->x_off[object_id], 5332280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp object_id,(double) mng_info->y_off[object_id]); 53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object clipping info. 53383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 53393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 27) 53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[object_id]=mng_read_box(mng_info->frame,0, 53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &p[12]); 53420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 53443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 53473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickFalse; 53490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 5) 53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.red= 53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 53540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.green= 53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 53570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.blue= 53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 53600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickTrue; 53623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BACK,4) == 0) 53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 53703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=p[6]; 53720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 53750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mandatory_back && length > 5) 53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.red= 53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 53800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.green= 53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 53830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.blue= 53853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 53860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 538716ea139d53d867211d3bb0fa859a83de653f687ecristy mng_background_color.alpha=OpaqueAlpha; 53883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=(p[7] << 8) | p[8]; 53933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 53943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 53963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 539847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 53993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PLTE,4) == 0) 54003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 540147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global PLTE. */ 540247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length && (length < 769)) 54043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte == (png_colorp) NULL) 54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) AcquireQuantumMemory(256, 54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*mng_info->global_plte)); 54080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5409bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) (length/3); i++) 54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=p[3*i]; 54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=p[3*i+1]; 54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=p[3*i+2]; 54143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 541635ef824baa82511126ff0072ae30eee0da9c05a3cristy mng_info->global_plte_length=(unsigned int) (length/3); 54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=i; 54223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=i; 54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=i; 54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54268fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=256; 54283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=0; 54310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 543547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_tRNS,4) == 0) 54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* read global tRNS */ 54393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5440f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length > 0 && length < 257) 5441bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=p[i]; 54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 54453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 54463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=255; 54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 544812560f31d66b4ef4afdcff2c20807c555dcf2f7dcristy mng_info->global_trns_length=(unsigned int) length; 54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 54533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5456bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy igamma; 54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54598182b0758e3429fb8dcd1700f09643fd4d80a41ccristy igamma=mng_get_long(p); 54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_gamma=((float) igamma)*0.00001; 54613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickTrue; 54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickFalse; 54660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 54723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 547347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global cHRM */ 547447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 54763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54778182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.x=0.00001*mng_get_long(p); 54788182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.y=0.00001*mng_get_long(&p[4]); 54798182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.red_primary.x=0.00001*mng_get_long(&p[8]); 54803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.red_primary.y=0.00001* 54818182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[12]); 54823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.x=0.00001* 54838182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[16]); 54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.y=0.00001* 54858182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[20]); 54863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.x=0.00001* 54878182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[24]); 54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.y=0.00001* 54898182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[28]); 54903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickTrue; 54913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickFalse; 549447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 549847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 55003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 55023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global sRGB. 55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 55048fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5506e610a071534e448c46460a5aa39ede33bf56b329glennrp mng_info->global_srgb_intent= 5507cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickTrue; 55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickFalse; 551247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 551647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5519fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 55203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global iCCP. 55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 55248fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 552647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 552947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_FRAM,4) == 0) 55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 553316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 55343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"FRAM chunk found in MNG-VLC datastream","`%s'", 55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 55360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->framing_mode == 2) || (mng_info->framing_mode == 4)) 55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 55390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout=default_frame_timeout; 55423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=default_fb; 554347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55448fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p[0]) 55463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=p[0]; 55470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 55503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Framing_mode=%d",mng_info->framing_mode); 55510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 555447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Note the delay and frame clipping boundaries. */ 555547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* framing mode */ 555747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5558bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy while (*p && ((p-chunk) < (ssize_t) length)) 55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name */ 556047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name terminator */ 556247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5563bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((p-chunk) < (ssize_t) (length-4)) 55643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay, 55673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout, 55683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping; 55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay=(*p++); 55713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout=(*p++); 55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping=(*p++); 55733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* change_sync */ 557447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay) 55763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55778182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay=1UL*image->ticks_per_second* 55788182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(p); 55790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55808182b0758e3429fb8dcd1700f09643fd4d80a41ccristy if (mng_info->ticks_per_second != 0) 55818182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay/=mng_info->ticks_per_second; 55820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5583bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5584bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_delay=PNG_UINT_31_MAX; 55850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 55873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=frame_delay; 55880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 55900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5593e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_delay=%.20g",(double) frame_delay); 55943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 559547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_timeout) 55973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5598bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=1UL*image->ticks_per_second* 5599bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp mng_get_long(p); 56000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5601bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp if (mng_info->ticks_per_second != 0) 5602bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout/=mng_info->ticks_per_second; 56030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5604bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5605bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=PNG_UINT_31_MAX; 56060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56073a89fa4ae8254eda5e264fb9d6bfd97ea3022773glennrp if (change_timeout == 2) 56083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=frame_timeout; 56090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 56110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5614e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_timeout=%.20g",(double) frame_timeout); 56153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 561647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping) 56183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=mng_read_box(previous_fb,(char) p[0],&p[1]); 56203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=17; 56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=fb; 56220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Frame_clip: L=%.20g R=%.20g T=%.20g B=%.20g", 5626e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.left,(double) fb.right,(double) fb.top, 5627e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.bottom); 562847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping == 2) 56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=fb; 56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=fb; 56353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_minimum_box(fb,mng_info->frame); 56360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5637bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_width=(size_t) (mng_info->clip.right 56383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.left); 56390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5640bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_height=(size_t) (mng_info->clip.bottom 56413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.top); 56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the frame if framing_mode is 4. 56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5648e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " subframe_width=%.20g, subframe_height=%.20g",(double) 5649e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy subframe_width,(double) subframe_height); 56500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 4) && 56523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height)) 56533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 565447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 565516ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 565716ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 565847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 56623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 56633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 566547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 56673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 56700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 56800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 56833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 56888a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 569016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 56910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert backgd layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 5695e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 5696e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5702a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 57033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLIP,4) == 0) 57043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 57073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 57083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read CLIP. 57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5712a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (length > 3) 5713a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5714a454cdcb00e5a619edb3eac3070b649569448e4aglennrp first_object=(p[0] << 8) | p[1]; 5715a454cdcb00e5a619edb3eac3070b649569448e4aglennrp last_object=(p[2] << 8) | p[3]; 5716a454cdcb00e5a619edb3eac3070b649569448e4aglennrp p+=4; 571747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5718a454cdcb00e5a619edb3eac3070b649569448e4aglennrp for (i=(int) first_object; i <= (int) last_object; i++) 57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5720a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (mng_info->exists[i] && !mng_info->frozen[i]) 5721a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5722a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngBox 5723a454cdcb00e5a619edb3eac3070b649569448e4aglennrp box; 57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5725a454cdcb00e5a619edb3eac3070b649569448e4aglennrp box=mng_info->object_clip[i]; 5726a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if ((p-chunk) < (ssize_t) (length-17)) 5727a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->object_clip[i]= 5728a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_read_box(box,(char) p[0],&p[1]); 5729a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 57303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 573147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5732a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 57333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5736a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SAVE,4) == 0) 57383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 57403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i]) 57413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickTrue; 57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 57443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 57453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->frozen=MagickTrue; 57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57498fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_DISC,4) == 0) || (memcmp(type,mng_SEEK,4) == 0)) 57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 575747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read DISC or SEEK. */ 575847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((length == 0) || !memcmp(type,mng_SEEK,4)) 57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 57623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5767bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5770f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy for (j=1; j < (ssize_t) length; j+=2) 57713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5772f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy i=p[j-1] << 8 | p[j]; 57733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57778fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 578247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MOVE,4) == 0) 57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5785bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 57863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 578947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* read MOVE */ 579047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5791a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (length > 3) 57923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5793a454cdcb00e5a619edb3eac3070b649569448e4aglennrp first_object=(p[0] << 8) | p[1]; 5794a454cdcb00e5a619edb3eac3070b649569448e4aglennrp last_object=(p[2] << 8) | p[3]; 5795a454cdcb00e5a619edb3eac3070b649569448e4aglennrp p+=4; 57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5797a454cdcb00e5a619edb3eac3070b649569448e4aglennrp for (i=(ssize_t) first_object; i <= (ssize_t) last_object; i++) 5798a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5799a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (mng_info->exists[i] && !mng_info->frozen[i] && 5800a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (p-chunk) < (ssize_t) (length-8)) 5801a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5802a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngPair 5803a454cdcb00e5a619edb3eac3070b649569448e4aglennrp new_pair; 58043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5805a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngPair 5806a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair; 5807a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 5808a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair.a=mng_info->x_off[i]; 5809a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair.b=mng_info->y_off[i]; 5810a454cdcb00e5a619edb3eac3070b649569448e4aglennrp new_pair=mng_read_pair(old_pair,(int) p[0],&p[1]); 5811a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->x_off[i]=new_pair.a; 5812a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->y_off[i]=new_pair.b; 5813a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 5814a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 581647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 58183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 58193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 58213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_LOOP,4) == 0) 58223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5823bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t loop_iters=1; 582424e6d42307643613e0430bac65beddf8a43671bdglennrp if (length > 4) 5825a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5826a454cdcb00e5a619edb3eac3070b649569448e4aglennrp loop_level=chunk[0]; 5827a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_active[loop_level]=1; /* mark loop active */ 582847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5829a454cdcb00e5a619edb3eac3070b649569448e4aglennrp /* Record starting point. */ 5830a454cdcb00e5a619edb3eac3070b649569448e4aglennrp loop_iters=mng_get_long(&chunk[1]); 58310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5832a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (logging != MagickFalse) 5833a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5834a454cdcb00e5a619edb3eac3070b649569448e4aglennrp " LOOP level %.20g has %.20g iterations ", 5835a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (double) loop_level, (double) loop_iters); 58360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5837a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (loop_iters == 0) 5838a454cdcb00e5a619edb3eac3070b649569448e4aglennrp skipping_loop=loop_level; 58390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5840a454cdcb00e5a619edb3eac3070b649569448e4aglennrp else 5841a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5842a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_jump[loop_level]=TellBlob(image); 5843a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_count[loop_level]=loop_iters; 5844a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5846a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_iteration[loop_level]=0; 5847a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 58493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 58503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 585147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_ENDL,4) == 0) 58533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 585424e6d42307643613e0430bac65beddf8a43671bdglennrp if (length > 0) 58553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 585624e6d42307643613e0430bac65beddf8a43671bdglennrp loop_level=chunk[0]; 585724e6d42307643613e0430bac65beddf8a43671bdglennrp 585824e6d42307643613e0430bac65beddf8a43671bdglennrp if (skipping_loop > 0) 58593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 586024e6d42307643613e0430bac65beddf8a43671bdglennrp if (skipping_loop == loop_level) 586124e6d42307643613e0430bac65beddf8a43671bdglennrp { 586224e6d42307643613e0430bac65beddf8a43671bdglennrp /* 586324e6d42307643613e0430bac65beddf8a43671bdglennrp Found end of zero-iteration loop. 586424e6d42307643613e0430bac65beddf8a43671bdglennrp */ 586524e6d42307643613e0430bac65beddf8a43671bdglennrp skipping_loop=(-1); 586624e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_active[loop_level]=0; 586724e6d42307643613e0430bac65beddf8a43671bdglennrp } 58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 586947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 587024e6d42307643613e0430bac65beddf8a43671bdglennrp else 58713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 587224e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_active[loop_level] == 1) 58733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 587424e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_count[loop_level]--; 587524e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_iteration[loop_level]++; 58760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 587724e6d42307643613e0430bac65beddf8a43671bdglennrp if (logging != MagickFalse) 587824e6d42307643613e0430bac65beddf8a43671bdglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 587924e6d42307643613e0430bac65beddf8a43671bdglennrp " ENDL: LOOP level %.20g has %.20g remaining iters ", 588024e6d42307643613e0430bac65beddf8a43671bdglennrp (double) loop_level,(double) 588124e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_count[loop_level]); 588247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 588324e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_count[loop_level] != 0) 588424e6d42307643613e0430bac65beddf8a43671bdglennrp { 588524e6d42307643613e0430bac65beddf8a43671bdglennrp offset= 588624e6d42307643613e0430bac65beddf8a43671bdglennrp SeekBlob(image,mng_info->loop_jump[loop_level], 588724e6d42307643613e0430bac65beddf8a43671bdglennrp SEEK_SET); 58883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 588924e6d42307643613e0430bac65beddf8a43671bdglennrp if (offset < 0) 589024e6d42307643613e0430bac65beddf8a43671bdglennrp ThrowReaderException(CorruptImageError, 589124e6d42307643613e0430bac65beddf8a43671bdglennrp "ImproperImageHeader"); 589224e6d42307643613e0430bac65beddf8a43671bdglennrp } 589324e6d42307643613e0430bac65beddf8a43671bdglennrp 589424e6d42307643613e0430bac65beddf8a43671bdglennrp else 589524e6d42307643613e0430bac65beddf8a43671bdglennrp { 589624e6d42307643613e0430bac65beddf8a43671bdglennrp short 589724e6d42307643613e0430bac65beddf8a43671bdglennrp last_level; 589824e6d42307643613e0430bac65beddf8a43671bdglennrp 589924e6d42307643613e0430bac65beddf8a43671bdglennrp /* 590024e6d42307643613e0430bac65beddf8a43671bdglennrp Finished loop. 590124e6d42307643613e0430bac65beddf8a43671bdglennrp */ 590224e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_active[loop_level]=0; 590324e6d42307643613e0430bac65beddf8a43671bdglennrp last_level=(-1); 590424e6d42307643613e0430bac65beddf8a43671bdglennrp for (i=0; i < loop_level; i++) 590524e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_active[i] == 1) 590624e6d42307643613e0430bac65beddf8a43671bdglennrp last_level=(short) i; 590724e6d42307643613e0430bac65beddf8a43671bdglennrp loop_level=last_level; 590824e6d42307643613e0430bac65beddf8a43671bdglennrp } 59093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 591247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 59143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 59153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 591647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLON,4) == 0) 59183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->clon_warning == 0) 592016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 59213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"CLON is not implemented yet","`%s'", 59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 592347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clon_warning++; 59253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 592647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MAGN,4) == 0) 59283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 59313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 59333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 59363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 59373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 59383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 59393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 1) 59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=(p[0] << 8) | p[1]; 59430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=0; 59460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 3) 59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=(p[2] << 8) | p[3]; 59490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=magn_first; 59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef MNG_OBJECT_BUFFERS 59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first || magn_last) 59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 595616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 59573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MAGN is not implemented yet for nonzero objects", 59593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 596047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 59623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 4) 59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=p[4]; 596647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=0; 59693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=(p[5] << 8) | p[6]; 597247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 597547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mx == 0) 59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=(p[7] << 8) | p[8]; 598147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=magn_mx; 598447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_my == 0) 59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=1; 59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 10) 59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=(p[9] << 8) | p[10]; 599047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=magn_mx; 599347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_ml == 0) 59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=1; 59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 12) 59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=(p[11] << 8) | p[12]; 599947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=magn_mx; 600247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mr == 0) 60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=1; 60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 14) 60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=(p[13] << 8) | p[14]; 600847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=magn_my; 601147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mt == 0) 60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=1; 60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 60163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=(p[15] << 8) | p[16]; 601747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=magn_my; 602047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mb == 0) 60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=1; 60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=p[17]; 602647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=magn_methx; 60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 603047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx > 5 || magn_methy > 5) 60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 60333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 603416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Unknown MAGN method in MNG datastream","`%s'", 60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 603847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 60403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Magnify existing objects in the range magn_first to magn_last */ 60433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first == 0 || magn_last == 0) 60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Save the magnification factors for object 0 */ 60473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mb=magn_mb; 60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_ml=magn_ml; 60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mr=magn_mr; 60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mt=magn_mt; 60513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mx=magn_mx; 60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_my=magn_my; 60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methx=magn_methx; 60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methy=magn_methy; 60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 605747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PAST,4) == 0) 60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->past_warning == 0) 606116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"PAST is not implemented yet","`%s'", 60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 606447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->past_warning++; 60663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 606747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SHOW,4) == 0) 60693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->show_warning == 0) 607116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"SHOW is not implemented yet","`%s'", 60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 607447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->show_warning++; 60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 607747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sBIT,4) == 0) 60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 4) 60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickFalse; 608247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.gray=p[0]; 60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.red=p[0]; 60873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.green=p[1]; 60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.blue=p[2]; 60893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.alpha=p[3]; 60903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickTrue; 60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_x_pixels_per_unit= 60988182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(p); 60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_y_pixels_per_unit= 61008182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(&p[4]); 61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_phys_unit_type=p[8]; 61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickTrue; 61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 610447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickFalse; 61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYg,4) == 0) 61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->phyg_warning == 0) 611116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 61123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"pHYg is not implemented.","`%s'",image->filename); 611347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->phyg_warning++; 61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BASI,4) == 0) 61173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 611947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->basi_warning == 0) 612116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"BASI is not implemented yet","`%s'", 61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 612447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->basi_warning++; 61263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 6127bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 6129bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type=p[8]; 61323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method=p[9]; 61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type=p[10]; 61343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method=p[11]; 61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=(p[12] << 8) & p[13]; 613747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=0; 614047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 13) 61423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=(p[14] << 8) & p[15]; 614347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=0; 614647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 15) 61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=(p[16] << 8) & p[17]; 614947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=0; 615247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=(p[18] << 8) & p[19]; 615547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (basi_sample_depth == 16) 61593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=65535L; 61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=255; 61623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 616347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 19) 61653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=p[20]; 616647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=0; 616947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 617447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) 61763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 61773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy && memcmp(type,mng_JHDR,4) 61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ) 61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Not an IHDR or JHDR chunk */ 61828fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 618447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Process IHDR */ 61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing %c%c%c%c chunk",type[0],type[1],type[2],type[3]); 619147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[object_id]=MagickTrue; 619447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->invisible[object_id]) 61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skipping invisible object"); 620047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 62043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 62073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 620847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62098182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_width=(size_t) mng_get_long(p); 62108182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_height=(size_t) mng_get_long(&p[4]); 62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 62123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 62133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a transparent background layer behind the entire animation 62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if it is not full screen. 62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 62183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && mng_type && first_mng_object) 62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->clip.left > 0) || (mng_info->clip.top > 0) || 62223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_width < mng_info->mng_width) || 6223bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.right < (ssize_t) mng_info->mng_width) || 62243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_height < mng_info->mng_height) || 6225bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.bottom < (ssize_t) mng_info->mng_height)) 62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 622716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 623216ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 623347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 62383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 624047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 624447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 62463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 625147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 62533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 625447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 625547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Make a background rectangle. */ 625647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 62633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 62643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 626516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 62673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6268e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted transparent background layer, W=%.20g, H=%.20g", 6269e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->mng_width,(double) mng_info->mng_height); 62703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the upcoming image if 62743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode is 3, and we haven't already inserted one. 62753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 62763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 3) && 62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height) && (simplicity == 0 || 62783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (simplicity & 0x08))) 62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 628016ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 62813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 628516ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 628647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 629347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 62980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 62993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 630847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 63103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 63113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 63123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 63133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 63143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 63153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 63163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 63178a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 631816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 63190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 63213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 63220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 6323e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 6324e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MNG_INSERT_LAYERS */ 63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 632847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 632916ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 63303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 63323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 633416ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 633547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 63373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 63403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 63413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 634247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 63473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 63480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 63510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 63533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 63553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 63600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->framing_mode == 1 || mng_info->framing_mode == 3) 63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 63643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 63690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->x_off[object_id]; 63733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[object_id]; 63743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 637547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 63773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Seek back to the beginning of the IHDR or JHDR chunk's length field. 63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 637947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 63823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Seeking back to beginning of %c%c%c%c chunk",type[0],type[1], 63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[2],type[3]); 638447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6385bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy offset=SeekBlob(image,-((ssize_t) length+12),SEEK_CUR); 638647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 63883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 63923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_type=mng_type; 63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_id=object_id; 63943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) == 0) 63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 639747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 63993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 64013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 64043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6405889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (logging != MagickFalse) 6406889a928b732161b6353bd880e5ea0802f184c6d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6407889a928b732161b6353bd880e5ea0802f184c6d4glennrp "exit ReadJNGImage() with error"); 640847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 64103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 64143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 64183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 64193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 64213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type) 64243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box; 64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx || mng_info->magn_methy) 64293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height, 64323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width; 64333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing MNG MAGN chunk"); 64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx == 1) 64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width=mng_info->magn_ml; 644147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr; 644447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 644647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 644747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-2)*(mng_info->magn_mx)); 64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 644947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64524e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width=(png_uint_32) image->columns; 645347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_ml-1; 645647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr-1; 645947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 3) 646147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 646247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-3)*(mng_info->magn_mx-1)); 64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 646447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methy == 1) 64663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height=mng_info->magn_mt; 646847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 64703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb; 647147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 647347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 647447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-2)*(mng_info->magn_my)); 64753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 647647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64794e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_height=(png_uint_32) image->rows; 648047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 64823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mt-1; 648347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 64853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb-1; 648647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 3) 648847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 648947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-3)*(mng_info->magn_my-1)); 64903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 649147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magnified_height > image->rows || 64933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width > image->columns) 64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 64963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *large_image; 64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 64993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy; 65003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 650116ea139d53d867211d3bb0fa859a83de653f687ecristy Quantum 650216ea139d53d867211d3bb0fa859a83de653f687ecristy *next, 650316ea139d53d867211d3bb0fa859a83de653f687ecristy *prev; 650416ea139d53d867211d3bb0fa859a83de653f687ecristy 650516ea139d53d867211d3bb0fa859a83de653f687ecristy png_uint_16 650616ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methx, 650716ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methy; 650816ea139d53d867211d3bb0fa859a83de653f687ecristy 6509bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m, 65113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 651316ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 65143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *n, 65153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 65163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 651716ea139d53d867211d3bb0fa859a83de653f687ecristy register ssize_t 651816ea139d53d867211d3bb0fa859a83de653f687ecristy x; 65193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 652047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 652147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocate magnified image"); 652547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 652616ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 652747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 65313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 65333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image=SyncNextImageInList(image); 65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->columns=magnified_width; 65383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->rows=magnified_height; 65393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=mng_info->magn_methx; 65413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=mng_info->magn_methy; 65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65433faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 65443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM unsigned short 65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 65463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Scale pixels to unsigned shorts to prevent 65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy overflow of intermediate values of interpolations 65503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6551bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 65523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1, 65543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 655547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6556bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 655816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleQuantumToShort( 655916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 656016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleQuantumToShort( 656116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 656216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleQuantumToShort( 656316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 656416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleQuantumToShort( 656516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 656616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 65673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 656847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 65703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 65713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 65743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM Quantum 65753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 65763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 657717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 657816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 657947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 65813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 658216ea139d53d867211d3bb0fa859a83de653f687ecristy large_image->background_color.alpha=OpaqueAlpha; 658316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 658447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 65863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=2; 658747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 65893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=3; 659047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 65923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=2; 659347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 65953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=3; 65963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the rows into the right side of the large image */ 65993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6602e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the rows to %.20g",(double) large_image->rows); 6603bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy=0; 66054f7c434c6c7047588b48a5b71281f9ecf4c9d1accristy length=(size_t) GetPixelChannels(image)*image->columns; 660616ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) AcquireQuantumMemory(length,sizeof(*next)); 660716ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) AcquireQuantumMemory(length,sizeof(*prev)); 660847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 660916ea139d53d867211d3bb0fa859a83de653f687ecristy if ((prev == (Quantum *) NULL) || 661016ea139d53d867211d3bb0fa859a83de653f687ecristy (next == (Quantum *) NULL)) 66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 66153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 66163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 661747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,0,image->columns,1,exception); 66193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 662047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6621bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 66223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (y == 0) 6624bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 662547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6626bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-2) 6627bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 662847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6629bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy <= 1 && y == (ssize_t) image->rows-1) 6630bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 663147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6632bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-1) 66333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 663447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6636bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_my; 663747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=prev; 66393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=next; 66403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=n; 664147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6642bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (y < (ssize_t) image->rows-1) 66433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,y+1,image->columns,1, 66453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 66473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 664847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++, yy++) 66503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 665116ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6654bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(yy < (ssize_t) large_image->rows); 66553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=prev; 66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=next; 66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(large_image,0,yy,large_image->columns, 66589fff7b4fa7d657da7bfed66239982b85c6337de9cristy 1,exception); 665916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=(large_image->columns-image->columns)* 666016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelChannels(large_image); 666147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6662bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6664fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: get color as function of indexes[x] */ 66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 66673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy <= 1) 66723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6673bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /* replicate previous */ 667416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,pixels),q); 667516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 667616ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 667716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 667816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 667916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 668016ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 668247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methy == 2 || magn_methy == 4) 66843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6686bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 668716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 668816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 668916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 669016ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 669116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 669216ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 669316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 669416ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6695bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 669647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 670016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,((QM) (((ssize_t) 670116ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelRed(image,n) 670216ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels)+m))/ 6703bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 670416ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelRed(image,pixels)))),q); 670516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,((QM) (((ssize_t) 670616ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelGreen(image,n) 670716ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels)+m))/ 6708bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 670916ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelGreen(image,pixels)))),q); 671016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,((QM) (((ssize_t) 671116ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelBlue(image,n) 671216ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels)+m))/ 6713bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 671416ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelBlue(image,pixels)))),q); 671547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 671617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 671716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image, ((QM) (((ssize_t) 671816ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelAlpha(image,n) 671916ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)+m)) 6720bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 672116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)))),q); 67223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 672347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 67253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 67273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 672816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 672916ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 67303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 673116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 673216ea139d53d867211d3bb0fa859a83de653f687ecristy n),q); 67333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 673547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methy == 3 || magn_methy == 5) */ 67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6740bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 674116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 674216ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 674316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 674416ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 674516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 674616ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 674716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 674816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6749bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 675047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6752bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 675316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,n),q); 675416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image,n), 675516ea139d53d867211d3bb0fa859a83de653f687ecristy q); 675616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image,n), 675716ea139d53d867211d3bb0fa859a83de653f687ecristy q); 675816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image,n), 675916ea139d53d867211d3bb0fa859a83de653f687ecristy q); 6760bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 676147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 67633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 676416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,(QM) (((ssize_t) (2*i* 676516ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,n) 676616ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)) 6767bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp +m))/((ssize_t) (m*2)) 676816ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 67693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 677116ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 677216ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(large_image); 677316ea139d53d867211d3bb0fa859a83de653f687ecristy pixels+=GetPixelChannels(image); 67743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* x */ 677547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(large_image,exception) == 0) 67773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 677847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* i */ 67803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* y */ 678147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 678216ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) RelinquishMagickMemory(prev); 678316ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) RelinquishMagickMemory(next); 67843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns; 67863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Delete original image"); 67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DeleteImageFromList(&image); 67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=large_image; 67943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 67963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the columns */ 67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6800e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the columns to %.20g",(double) image->columns); 68013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6802bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 680416ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 68063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 680816ea139d53d867211d3bb0fa859a83de653f687ecristy pixels=q+(image->columns-length)*GetPixelChannels(image); 680916ea139d53d867211d3bb0fa859a83de653f687ecristy n=pixels+GetPixelChannels(image); 681047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6811bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (image->columns-length); 6812bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy x < (ssize_t) image->columns; x++) 68133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 681416ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 68157c7b31566a7598be23cac1b5e32c697cfe7082f4glennrp 6816bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (x == (ssize_t) (image->columns-length)) 6817bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_ml; 681847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6819bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-2) 6820bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 682147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6822bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx <= 1 && x == (ssize_t) image->columns-1) 6823bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 682447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6825bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-1) 68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 682747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6829bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mx; 683047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++) 68323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx <= 1) 68343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* replicate previous */ 683616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 683716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 683816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 683916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 68403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 684147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methx == 2 || magn_methx == 4) 68433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6845bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 684616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 684716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 684816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 684916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6850bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 685147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 685216ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 68533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 68543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 685616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,(QM) ((2*i*( 685716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,n) 685816ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels))+m) 6859bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 686016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,pixels)),q); 6861bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 686216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,(QM) ((2*i*( 686316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,n) 686416ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels))+m) 6865bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 686616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,pixels)),q); 6867bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 686816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,(QM) ((2*i*( 686916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,n) 687016ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels))+m) 6871bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 687216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,pixels)),q); 687317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 687416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,(QM) ((2*i*( 687516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n) 687616ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m) 6877bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 687816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)),q); 68793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 688047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 68823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 68843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6885bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 688616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 688716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)+0,q); 6888bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 68893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6890bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 689116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 689216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n)+0,q); 6893bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 68943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 68953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 689647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methx == 3 || magn_methx == 5) */ 68983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 69003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6901bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 690216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 690316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 690416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 690516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6906bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 690747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6909bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 691016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,n),q); 691116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,n),q); 691216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,n),q); 691316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,n),q); 6914bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 691547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 69173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 691916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 692016ea139d53d867211d3bb0fa859a83de653f687ecristy (QM) ((2*i*( GetPixelAlpha(image,n) 692116ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m)/ 6922bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 692316ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 69243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 692616ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 69273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 692816ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 693047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 69323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 69333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69343faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 69353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 69363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Rescale pixels to Quantum 69393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6940bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 69413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 694347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6944bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 694616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleShortToQuantum( 694716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 694816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleShortToQuantum( 694916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 695016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleShortToQuantum( 695116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 695216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleShortToQuantum( 695316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 695416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 695647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 69583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 69593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 69623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished MAGN processing"); 69653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 69693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_box is with respect to the upper left corner of the MNG. 69703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 69713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.left=mng_info->image_box.left+mng_info->x_off[object_id]; 69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.right=mng_info->image_box.right+mng_info->x_off[object_id]; 69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.top=mng_info->image_box.top+mng_info->y_off[object_id]; 69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.bottom=mng_info->image_box.bottom+mng_info->y_off[object_id]; 69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->clip); 69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->frame); 69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->object_clip[object_id]); 69783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left != (mng_info->image_box.left 69793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 69803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.right != (mng_info->image_box.right 69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 69823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top != (mng_info->image_box.top 69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id])) || 69843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.bottom != (mng_info->image_box.bottom 69853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id]))) 69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Crop the PNG image"); 699047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left < crop_box.right) && 69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top < crop_box.bottom)) 69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 69953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *im; 69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info; 69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_info is with respect to the upper left corner of 70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the image. 70033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.x=(crop_box.left-mng_info->x_off[object_id]); 70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.y=(crop_box.top-mng_info->y_off[object_id]); 7006bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.width=(size_t) (crop_box.right-crop_box.left); 7007bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.height=(size_t) (crop_box.bottom-crop_box.top); 70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 70093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 70103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 70113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 70123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=CropImage(image,&crop_info,exception); 701347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (im != (Image *) NULL) 70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=im->columns; 70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=im->rows; 70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=DestroyImage(im); 70193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 70203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=crop_box.left; 70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=crop_box.top; 70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 702547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy No pixels in crop area. The MNG spec still requires 70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a layer, though, so make a single transparent pixel in 70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the top left corner. 70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=1; 70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=1; 70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 703616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=1; 70383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=1; 70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 70443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 70453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70482b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 70492b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 705016ea139d53d867211d3bb0fa859a83de653f687ecristy * if lossy. 70512b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 70522b013e4b9b602533eff410e61c3683fb2a3ab913glennrp if (image->depth > 16) 70532b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 70542b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 70552b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 70563faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 7057cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 7058cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 7059cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 7060cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 7061cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 7062cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 706316ea139d53d867211d3bb0fa859a83de653f687ecristy if (LosslessReduceDepthOK(image,exception) != MagickFalse) 70648640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 70653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7066d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 70683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->scenes_found > 7070bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) (image_info->first_scene+image_info->number_scenes)) 70713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7073d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading image datastream."); 7077d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (LocaleCompare(image_info->magick,"MNG") == 0); 707947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 708147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading all image datastreams."); 708547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && !mng_info->image_found && (mng_info->mng_width) && 70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height)) 70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer if nothing else was found. 70923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No images found. Inserting a background layer."); 70960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 709716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 70983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 710216ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 710747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocation failed, returning NULL."); 711147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 71153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 71203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 71238a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 71240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 712616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 71270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 71320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == 1) 71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 71350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 71373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 71393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count > 10*mng_info->image_found) 71403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," No beginning"); 714347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 714416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted, beginning of list not found", 71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 714747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 71520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Corrupt list"); 715747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 715816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted; next_image is NULL","`%s'", 71603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 716347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second && mng_info->image_found > 1 && 71653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetNextImageInList(image) == 71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (Image *) NULL) 71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " First image null"); 717147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 717216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"image->next for first image is NULL but shouldn't be.", 71743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 71753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 717647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->image_found == 0) 71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No visible images found."); 718247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 718316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"No visible images in file","`%s'",image_info->filename); 718547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 718847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second) 71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1UL*MagickMax(image->ticks_per_second,1L)* 71953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/mng_info->ticks_per_second; 71960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 71983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 71990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Find final nonzero image delay */ 72013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=0; 72020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay) 72063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=image->delay; 720747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 72093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay < final_image_delay) 72123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=final_image_delay; 72130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=final_delay; 72150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7218e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->delay=%.20g, final_delay=%.20g",(double) image->delay, 7219e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) final_delay); 72200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 722847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 72303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Before coalesce:"); 723147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7233e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g",(double) image->delay); 723447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7239e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g",(double) scene++,(double) image->delay); 72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 72443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_COALESCE_LAYERS 72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers) 72463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image, 72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next; 72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7251bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 72523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Coalesce Images"); 725647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=image->scene; 725816ea139d53d867211d3bb0fa859a83de653f687ecristy next_image=CoalesceImages(image,exception); 725947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 726247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 72643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 726547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next=image; next != (Image *) NULL; next=next_image) 72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.width=mng_info->mng_width; 72693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.height=mng_info->mng_height; 72703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.x=0; 72713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.y=0; 72723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->scene=scene++; 72733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next); 727447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 727747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->delay == 0) 72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->previous=GetPreviousImageInList(next); 72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetPreviousImageInList(next) == (Image *) NULL) 72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->previous->next=next_image; 72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=DestroyImage(next); 72873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 729447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->dispose=BackgroundDispose; 72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 730447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 73063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " After coalesce:"); 730747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7309e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g dispose=%.20g",(double) image->delay, 7310e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->dispose); 731147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 7313f2faecf9facdbbb14fcba373365f9f691a9658e0cristy { 7314f2faecf9facdbbb14fcba373365f9f691a9658e0cristy image=GetNextImageInList(image); 731547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7316f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7317e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g dispose=%.20g",(double) scene++, 7318e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay,(double) image->dispose); 7319f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 7320f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 732147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 73233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 73243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 732547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 73273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()"); 732847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 73303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 733125c1e2baba76d9cf3ec582f217f96af95259e747glennrp#else /* PNG_LIBPNG_VER > 10011 */ 73323ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 73333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 733647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 73383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "PNG library is too old","`%s'",image_info->filename); 733947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(Image *) NULL; 73413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 734247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 73443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ReadPNGImage(image_info,exception)); 73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 734725c1e2baba76d9cf3ec582f217f96af95259e747glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 73493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r P N G I m a g e % 73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterPNGImage() adds properties for the PNG image format to 73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The properties include the image format 73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterPNGImage method is: 73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7370bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterPNGImage(void) 73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7373bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterPNGImage(void) 73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 7376151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy version[MagickPathExtent]; 73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy static const char 73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *PNGNote= 73833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/ for details about the PNG format." 73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 738647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *JNGNote= 73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the JNG\n" 73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 739247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *MNGNote= 73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the MNG\n" 73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 740047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_LIBPNG_VER_STRING) 7402151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,"libpng ",MagickPathExtent); 7403151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,PNG_LIBPNG_VER_STRING,MagickPathExtent); 740447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(PNG_LIBPNG_VER_STRING,png_get_header_ver(NULL)) != 0) 74063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7407151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,",",MagickPathExtent); 74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,png_get_libpng_ver(NULL), 7409151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent); 74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 741247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 741306b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","MNG","Multiple-image Network Graphics"); 741408e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags|=CoderSeekableStreamFlag; /* To do: eliminate this. */ 741547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadMNGImage; 74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteMNGImage; 74193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 742047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsMNG; 742247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 742547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7426afc97b1e31b78c973c4bf5e0be8d5090cfca8065glennrp entry->mime_type=ConstantString("video/x-mng"); 74273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(MNGNote); 74283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 743006b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG","Portable Network Graphics"); 743147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 743647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 743808e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7439d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 744047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 744347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(PNGNote); 74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 744706b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG8", 744806b627a07ff44e1ff93ef1288c9f428066ded10ddirk "8-bit indexed with optional binary transparency"); 744947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 745447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 745608e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7457d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 74583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 746006b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG24", 746106b627a07ff44e1ff93ef1288c9f428066ded10ddirk "opaque or binary transparent 24-bit RGB"); 74623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 746347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(ZLIB_VERSION) 7465151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,"zlib ",MagickPathExtent); 7466151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,ZLIB_VERSION,MagickPathExtent); 746747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(ZLIB_VERSION,zlib_version) != 0) 74693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7470151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,",",MagickPathExtent); 7471151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,zlib_version,MagickPathExtent); 74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 747447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 747747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 748247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 748408e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7485d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 748806b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG32","opaque or transparent 32-bit RGBA"); 748947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 749447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 749608e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7497d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 74983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 750006b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG48", 750106b627a07ff44e1ff93ef1288c9f428066ded10ddirk "opaque or binary transparent 48-bit RGB"); 7502fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7503fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 7504fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 7505fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 7506fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#endif 7507fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7508fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 750908e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7510d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 7511fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) RegisterMagickInfo(entry); 7512fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 751306b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG64","opaque or transparent 64-bit RGBA"); 7514fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7515fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 7516fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 7517fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 7518fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#endif 7519fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7520fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 752108e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7522d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 7523fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) RegisterMagickInfo(entry); 7524fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 752506b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG00", 7526698aab67f255491ec6bd984c9d0163990df57622glennrp "PNG inheriting bit-depth, color-type from original, if possible"); 75275830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 75285830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 75295830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 75305830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 75315830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp#endif 75325830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 75335830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 753408e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7535d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 75365830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) RegisterMagickInfo(entry); 75375830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 753806b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","JNG","JPEG Network Graphics"); 753947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 75413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 75423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadJNGImage; 75433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteJNGImage; 75443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 75453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 754647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsJNG; 754808e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 75497fee329aec1090ff832c1b07fc4cc70c3b604f65glennrp entry->mime_type=ConstantString("image/x-jng"); 75503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(JNGNote); 75513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 755247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7553868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 75543d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy ping_semaphore=AcquireSemaphoreInfo(); 755518b17443128598500357da7bff2f01683cf32890cristy#endif 755647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 75593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 75613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 75623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r P N G I m a g e % 75663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage() removes format registrations made by the 75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG module from the list of supported formats. 75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterPNGImage method is: 75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage(void) 75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterPNGImage(void) 75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("MNG"); 75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG"); 75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG8"); 75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG24"); 75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG32"); 7586fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) UnregisterMagickInfo("PNG48"); 7587fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) UnregisterMagickInfo("PNG64"); 75885830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) UnregisterMagickInfo("PNG00"); 75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("JNG"); 759047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7591868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 7592cf002022280cc4dedb2748ad6f415aac1d44f530glennrp if (ping_semaphore != (SemaphoreInfo *) NULL) 75933d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy RelinquishSemaphoreInfo(&ping_semaphore); 75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 75963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 759825c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if PNG_LIBPNG_VER > 10011 75993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 76003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 76013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e M N G I m a g e % 76053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 76093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteMNGImage() writes an image in the Portable Network Graphics 76113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Group's "Multiple-image Network Graphics" encoded image format. 76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteMNGImage method is: 76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 761716ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteMNGImage(const ImageInfo *image_info, 761816ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 76193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 76213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 76233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 762616ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do (as of version 5.5.2, November 26, 2002 -- glennrp -- see also 76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "To do" under ReadPNGImage): 76303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Write the iCCP chunk at MNG level when (icc profile length > 0) 76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Improve selection of color type (use indexed-colour or indexed-colour 76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% with tRNS when 256 or fewer unique RGBA values are present). 76393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Figure out what to do with "dispose=<restore-to-previous>" (dispose == 3) 76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% This will be complicated if we limit ourselves to generating MNG-LC 76423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files. For now we ignore disposal method 3 and simply overlay the next 76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image on it. 76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical PLTE's or PLTE/tRNS combinations and use a 76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% global MNG PLTE or PLTE/tRNS combination when appropriate. 76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% [mostly done 15 June 1999 but still need to take care of tRNS] 76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sRGB and replace with a global sRGB (and remove 76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% gAMA/cHRM if sRGB is found; check for identical gAMA/cHRM and 76513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% replace with global gAMA/cHRM (or with sRGB if appropriate; replace 76523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% local gAMA/cHRM with local sRGB if appropriate). 76533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sBIT chunks and write global ones. 76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide option to skip writing the signature tEXt chunks. 76573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use signatures to detect identical objects and reuse the first 76593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instance of such objects instead of writing duplicate objects. 76603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use a smaller-than-32k value of compression window size when 76623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% appropriate. 76633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Encode JNG datastreams. Mostly done as of 5.5.2; need to write 76653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary text chunks and save profiles. 76663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force LC files (to ensure exact framing rate) 76683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instead of VLC. 76693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force VLC files instead of LC, even when offsets 76713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% are present. This will involve expanding the embedded images with a 76723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparent region at the top and/or left. 76733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 76743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 7676cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_png_write_raw_profile(const ImageInfo *image_info,png_struct *ping, 76773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info *ping_info, unsigned char *profile_type, unsigned char 76783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile_description, unsigned char *profile_data, png_uint_32 length) 76793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 76803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 76813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7683bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 76843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *sp; 76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 76903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp; 76913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 76933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length, 76943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length; 76953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 76973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 76983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((char *) profile_type+1, "ng-chunk-",9) == 0) 77003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return; 77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) printf("writing raw profile: type=%s, length=%.20g\n", 77050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (char *) profile_type, (double) length); 77063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 77070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 7708ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 7709a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_alloc_size_t) sizeof(png_text)); 7710a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 7711a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); 7712a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length=(png_uint_32) strlen((const char *) profile_description); 77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length=(png_uint_32) (length*2 + (length >> 5) + 20 77153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy + description_length); 7716ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 7717a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].text=(png_charp) png_malloc(ping, 7718a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy (png_alloc_size_t) allocated_length); 7719a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].key=(png_charp) png_malloc(ping, (png_alloc_size_t) 80); 7720a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 7721a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].text=(png_charp) png_malloc(ping, (png_size_t) allocated_length); 7722a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].key=(png_charp) png_malloc(ping, (png_size_t) 80); 7723a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 77243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key[0]='\0'; 77253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key, 7726151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy "Raw profile type ",MagickPathExtent); 77273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key,(const char *) profile_type,62); 77283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=profile_data; 77293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=text[0].text; 77303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(dp,(const char *) profile_description, 77323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length); 77333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=description_length; 77343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77353b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(dp,allocated_length- 7736f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (png_size_t) (dp-text[0].text),"%8lu ",(unsigned long) length); 77373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=8; 773847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7739bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%36 == 0) 77423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp >> 4) & 0x0f)]; 77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp++ ) & 0x0f)]; 77453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 774647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp='\0'; 77493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length=(png_size_t) (dp-text[0].text); 77503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].compression=image_info->compression == NoCompression || 77513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->compression == UndefinedCompression && 77523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length < 128) ? -1 : 0; 775347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (text[0].text_length <= allocated_length) 77553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_text(ping,ping_info,text,1); 775647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].text); 77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].key); 77593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text); 77603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 77613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7762cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic MagickBooleanType Magick_png_write_chunk_from_profile(Image *image, 77634383ec8c3c8811128f5a8a034d67c47db5e7e75acristy const char *string, MagickBooleanType logging) 77643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 77653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 77663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 77693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *data; 77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 length; 77753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 777747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 777847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 777947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 77803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 778147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (const StringInfo *) NULL) 77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 7785cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_profile; 77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 778747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (LocaleNCompare(name,string,11) == 0) 778847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 778947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (logging != MagickFalse) 779047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 779147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp " Found %s profile",name); 779247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7793cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=CloneStringInfo(profile); 7794cf002022280cc4dedb2748ad6f415aac1d44f530glennrp data=GetStringInfoDatum(ping_profile), 7795cf002022280cc4dedb2748ad6f415aac1d44f530glennrp length=(png_uint_32) GetStringInfoLength(ping_profile); 779647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[4]=data[3]; 779747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[3]=data[2]; 779847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[2]=data[1]; 779947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[1]=data[0]; 780047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,length-5); /* data length */ 780147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlob(image,length-1,data+1); 780247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,crc32(0,data+1,(uInt) length-1)); 7803cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=DestroyStringInfo(ping_profile); 780447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp } 78053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 780647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 78073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 78083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 780947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 78103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 78113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 78123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 781368a6b50ae30f5a551cd31d6e4b0c72990897a84fdirkstatic inline MagickBooleanType Magick_png_color_equal(const Image *image, 781468a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk const Quantum *p, const PixelInfo *q) 781568a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk{ 781668a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk MagickRealType 781768a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value; 781868a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 781968a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[RedPixelChannel].offset]; 782068a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->red) >= MagickEpsilon) 782168a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 782268a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[GreenPixelChannel].offset]; 782368a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->green) >= MagickEpsilon) 782468a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 782568a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[BluePixelChannel].offset]; 782668a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->blue) >= MagickEpsilon) 782768a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 782868a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 782968a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickTrue); 783068a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk} 783168a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 7832fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 7833fd6fd07e58e3d37313bec849313ac6e2b92e3957dirkstatic void write_tIME_chunk(Image *image,png_struct *ping,png_info *info, 7834fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk const char *date,ExceptionInfo *exception) 7835fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk{ 7836fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk unsigned int 7837fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk day, 7838fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk hour, 7839fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk minute, 7840fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk month, 7841fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk second, 7842fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk year; 7843fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7844fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_time 7845fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime; 7846fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7847fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time_t 7848fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ttime; 7849fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7850fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (date != (const char *) NULL) 7851fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7852fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (sscanf(date,"%d-%d-%dT%d:%d:%dZ",&year,&month,&day,&hour,&minute, 7853fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk &second) != 6) 7854fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7855fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 7856fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk "Invalid date format specified for png:tIME","`%s'", 7857fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk image->filename); 7858fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk return; 7859fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7860fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.year=(png_uint_16) year; 7861fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.month=(png_byte) month; 7862fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.day=(png_byte) day; 7863fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.hour=(png_byte) hour; 7864fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.minute=(png_byte) minute; 7865fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.second=(png_byte) second; 7866fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7867fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk else 7868fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7869fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time(&ttime); 7870fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_convert_from_time_t(&ptime,ttime); 7871fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7872fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_set_tIME(ping,info,&ptime); 7873fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk} 7874fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 7875b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 7876b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp/* Write one PNG image */ 78773ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, 787816ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *IMimage_info,Image *IMimage,ExceptionInfo *exception) 78793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 78800997332e2c35a821b271d6e7473c01c10dc206adcristy char 78810997332e2c35a821b271d6e7473c01c10dc206adcristy im_vers[32], 78820997332e2c35a821b271d6e7473c01c10dc206adcristy libpng_runv[32], 78830997332e2c35a821b271d6e7473c01c10dc206adcristy libpng_vers[32], 78840997332e2c35a821b271d6e7473c01c10dc206adcristy zlib_runv[32], 78850997332e2c35a821b271d6e7473c01c10dc206adcristy zlib_vers[32]; 78860997332e2c35a821b271d6e7473c01c10dc206adcristy 788716ea139d53d867211d3bb0fa859a83de653f687ecristy Image 788816ea139d53d867211d3bb0fa859a83de653f687ecristy *image; 788916ea139d53d867211d3bb0fa859a83de653f687ecristy 789016ea139d53d867211d3bb0fa859a83de653f687ecristy ImageInfo 789116ea139d53d867211d3bb0fa859a83de653f687ecristy *image_info; 789216ea139d53d867211d3bb0fa859a83de653f687ecristy 78933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 78943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s[2]; 78953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 78963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 78973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name, 78983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *property, 78993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 79003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 79023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 79033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 79053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 7906cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp pass; 7907cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp 7908e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp png_byte 7909e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_trans_alpha[256]; 79105af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 791139992b4dd9b12ef752d55b8e402c069698851f72glennrp png_color 791239992b4dd9b12ef752d55b8e402c069698851f72glennrp palette[257]; 79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79145af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_color_16 79155af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background, 79165af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color; 79175af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 79193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 79203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 79223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 79233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79245af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_uint_32 79255af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_height, 79265af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_width; 79275af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7928bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 79293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 79303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 793258e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp image_matte, 793321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 793458e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp matte, 793558e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp 7936da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob, 7937fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency, 7938d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color, 79398d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw, 794039992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE, 7941991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD, 7942918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP, 7943991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs, 7944918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB, 7945991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS, 794626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 794726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_bKGD, 794826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_cHRM, 7949a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date, 7950e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_EXIF, */ 795126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_gAMA, 795226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_iCCP, 795326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* ping_exclude_iTXt, */ 795426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_oFFs, 795526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_pHYs, 795626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_sRGB, 795726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_tEXt, 7958fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_exclude_tIME, 7959e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_tRNS, */ 796026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_vpAg, 796126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zCCP, /* hex-encoded iCCP */ 796226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zTXt, 796326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 79648d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap, 7965ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP, 79660e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning, 79670e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 796882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp status, 79698ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332, 7970d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_333, 7971d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444; 79723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79730997332e2c35a821b271d6e7473c01c10dc206adcristy MemoryInfo 7974af1534a4abd2d6ef7f7e2833b95400301faff3d3cristy *volatile pixel_info; 79750997332e2c35a821b271d6e7473c01c10dc206adcristy 79763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 79773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 79783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 797916ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 798016ea139d53d867211d3bb0fa859a83de653f687ecristy error_info; 798116ea139d53d867211d3bb0fa859a83de653f687ecristy 7982bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 79833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 79843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 79853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 79870997332e2c35a821b271d6e7473c01c10dc206adcristy *ping_pixels; 7988d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 79895af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp volatile int 7990f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors, 79910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth, 79925af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type, 79935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method, 79945af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method, 79955af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method, 79965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans; 79975af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7998bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 79995af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth, 80005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp old_bit_depth; 80013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8002bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 80033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality, 80043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes, 80053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth; 80063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8007dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp int 8008fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp j, 8009f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, 80108bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque, 80118bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent, 80128bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent, 8013dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type; 8014dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 8015dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp png_uint_32 8016dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution, 8017dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution; 8018dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 8020fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOnePNGImage()"); 80213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 802216ea139d53d867211d3bb0fa859a83de653f687ecristy image = CloneImage(IMimage,0,0,MagickFalse,exception); 802316ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=(ImageInfo *) CloneImageInfo(IMimage_info); 802416ea139d53d867211d3bb0fa859a83de653f687ecristy if (image_info == (ImageInfo *) NULL) 802516ea139d53d867211d3bb0fa859a83de653f687ecristy ThrowWriterException(ResourceLimitError, "MemoryAllocationFailed"); 8026b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 8027d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp /* Define these outside of the following "if logging()" block so they will 8028d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp * show in debuggers. 8029d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp */ 8030d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *im_vers='\0'; 8031d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 8032151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickLibVersionText,MagickPathExtent); 8033d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 8034151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickLibAddendum,MagickPathExtent); 8035ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 8036d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *libpng_vers='\0'; 8037d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(libpng_vers, 8038ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp PNG_LIBPNG_VER_STRING,32); 8039ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *libpng_runv='\0'; 8040ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(libpng_runv, 8041ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp png_get_libpng_ver(NULL),32); 8042ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 8043d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *zlib_vers='\0'; 8044d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(zlib_vers, 8045ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp ZLIB_VERSION,32); 8046ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *zlib_runv='\0'; 8047ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(zlib_runv, 8048ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_version,32); 8049ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 80508fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 8051d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp { 8052d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," IM version = %s", 8053d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp im_vers); 8054d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," Libpng version = %s", 8055d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp libpng_vers); 8056ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp if (LocaleCompare(libpng_vers,libpng_runv) != 0) 8057ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp { 8058ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 8059ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp libpng_runv); 8060ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp } 8061d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," Zlib version = %s", 8062d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp zlib_vers); 8063ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp if (LocaleCompare(zlib_vers,zlib_runv) != 0) 8064ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp { 8065ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 8066ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_runv); 8067ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp } 8068d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp } 8069d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 80705af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp /* Initialize some stuff */ 80710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=0, 80725af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=0, 80735af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=0, 80745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method=0, 80755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method=0, 80765af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans = 0; 80775af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 80785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.red = 0; 80795af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.green = 0; 80805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.blue = 0; 80815af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.gray = 0; 80825af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.index = 0; 80835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 80845af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red=0; 80855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green=0; 80865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue=0; 80875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=0; 80885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 8089dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type = 0; 8090dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution = 0; 8091dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution = 0; 8092dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 8093da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickFalse; 8094f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp ping_have_cheap_transparency=MagickFalse; 8095d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color=MagickTrue; 80968d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw=MagickTrue; 809739992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickFalse; 8098991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD=MagickFalse; 8099918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP=MagickFalse; 8100991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs=MagickFalse; 8101918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB=MagickFalse; 8102991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS=MagickFalse; 8103991d11dd9c33e65872778b81aff1347cd2878154glennrp 81040e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_bKGD=mng_info->ping_exclude_bKGD; 81050e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_cHRM=mng_info->ping_exclude_cHRM; 8106a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date=mng_info->ping_exclude_date; 8107dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_EXIF=mng_info->ping_exclude_EXIF; */ 81080e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_gAMA=mng_info->ping_exclude_gAMA; 81090e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_iCCP=mng_info->ping_exclude_iCCP; 81100e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* ping_exclude_iTXt=mng_info->ping_exclude_iTXt; */ 81110e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_oFFs=mng_info->ping_exclude_oFFs; 81120e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_pHYs=mng_info->ping_exclude_pHYs; 81130e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_sRGB=mng_info->ping_exclude_sRGB; 81140e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_tEXt=mng_info->ping_exclude_tEXt; 8115fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_exclude_tIME=mng_info->ping_exclude_tIME; 8116dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_tRNS=mng_info->ping_exclude_tRNS; */ 81170e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_vpAg=mng_info->ping_exclude_vpAg; 81180e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zCCP=mng_info->ping_exclude_zCCP; /* hex-encoded iCCP in zTXt */ 81190e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zTXt=mng_info->ping_exclude_zTXt; 81200e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 81218d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap = mng_info->ping_preserve_colormap; 8122ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP = mng_info->ping_preserve_iCCP; 81230e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning = MagickFalse; 81240e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 81250d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Recognize the ICC sRGB profile and convert it to the sRGB chunk, 81260d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * i.e., eliminate the ICC profile and set image->rendering_intent. 81270d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * Note that this will not involve any changes to the actual pixels 81280d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * but merely passes information to applications that read the resulting 81290d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * PNG image. 8130ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8131ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * To do: recognize other variants of the sRGB profile, using the CRC to 8132ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * verify all recognized variants including the 7 already known. 8133ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8134ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Work around libpng16+ rejecting some "known invalid sRGB profiles". 8135ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8136ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Use something other than image->rendering_intent to record the fact 8137ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * that the sRGB profile was found. 8138ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8139ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Record the ICC version (currently v2 or v4) of the incoming sRGB ICC 8140ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * profile. Record the Blackpoint Compensation, if any. 81410d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy */ 8142ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (ping_exclude_sRGB == MagickFalse && ping_preserve_iCCP == MagickFalse) 81430d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81440d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy char 81450d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *name; 81460d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81470d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy const StringInfo 81480d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *profile; 81490d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81500d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ResetImageProfileIterator(image); 81510d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 81520d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81530d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy profile=GetImageProfile(image,name); 81540d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81550d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (profile != (StringInfo *) NULL) 81560d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81570d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((LocaleCompare(name,"ICC") == 0) || 8158ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (LocaleCompare(name,"ICM") == 0)) 8159ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 8160ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8161ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp int 8162ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp icheck, 8163ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc=0; 81640d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81650d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8166ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp png_uint_32 8167ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length, 8168ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=0; 816929a106ed9ec29e243521b0f2a26c14281de8347fglennrp 8170ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp unsigned char 8171ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp *data; 81720d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8173ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length=(png_uint_32) GetStringInfoLength(profile); 817429a106ed9ec29e243521b0f2a26c14281de8347fglennrp 8175ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp for (icheck=0; sRGB_info[icheck].len > 0; icheck++) 817629a106ed9ec29e243521b0f2a26c14281de8347fglennrp { 8177ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (length == sRGB_info[icheck].len) 8178ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 8179ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (got_crc == 0) 8180ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8181ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8182ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp " Got a %lu-byte ICC profile (potentially sRGB)", 8183ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (unsigned long) length); 81840d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8185ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp data=GetStringInfoDatum(profile); 8186ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=crc32(0,data,length); 81870d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8188ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8189ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " with crc=%8x",(unsigned int) profile_crc); 8190ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc++; 8191ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 8192ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp 8193ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (profile_crc == sRGB_info[icheck].crc) 8194ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 8195ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8196ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " It is sRGB with rendering intent = %s", 8197ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntentString_from_PNG_RenderingIntent( 8198ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent)); 8199ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (image->rendering_intent==UndefinedIntent) 8200ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8201ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp image->rendering_intent= 8202ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntent_from_PNG_RenderingIntent( 8203ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent); 8204ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 8205ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_exclude_iCCP = MagickTrue; 8206ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_exclude_zCCP = MagickTrue; 8207ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_sRGB = MagickTrue; 8208ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp break; 8209ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp } 821029a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 82110d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 8212ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (sRGB_info[icheck].len == 0) 821329a106ed9ec29e243521b0f2a26c14281de8347fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8214ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Got a %lu-byte ICC profile not recognized as sRGB", 821529a106ed9ec29e243521b0f2a26c14281de8347fglennrp (unsigned long) length); 821629a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 82170d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82180d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy name=GetNextImageProfile(image); 82190d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82200d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82210d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 82228bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque = 0; 82238bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent = 0; 82248bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent = 0; 82258bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 8226fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 8227fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8228fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == UndefinedClass) 8229fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8230f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=UndefinedClass"); 8231fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == DirectClass) 8232fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8233f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=DirectClass"); 8234fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass) 8235fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8236f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=PseudoClass"); 8237f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), image->taint ? 8238cc96f2d3d09f91c9333d05e2e7216d4006f8a5eaglennrp " image->taint=MagickTrue": 8239cc96f2d3d09f91c9333d05e2e7216d4006f8a5eaglennrp " image->taint=MagickFalse"); 8240fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 824128af3713c9111a471cc868c787760de89236fa3cglennrp 8242750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp if (image->storage_class == PseudoClass && 82437e65e93c71716f2a5c03c0808adedae21d519fb2glennrp (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32 || 8244fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || mng_info->write_png64 || 8245fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (mng_info->write_png_colortype != 1 && 8246fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype != 5))) 82477e65e93c71716f2a5c03c0808adedae21d519fb2glennrp { 824816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 82497e65e93c71716f2a5c03c0808adedae21d519fb2glennrp image->storage_class = DirectClass; 82507e65e93c71716f2a5c03c0808adedae21d519fb2glennrp } 82517e65e93c71716f2a5c03c0808adedae21d519fb2glennrp 8252c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (ping_preserve_colormap == MagickFalse) 825328af3713c9111a471cc868c787760de89236fa3cglennrp { 8254c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (image->storage_class != PseudoClass && image->colormap != NULL) 8255c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8256c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp /* Free the bogus colormap; it can cause trouble later */ 8257c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8258c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8259c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Freeing bogus colormap"); 8260e9ac4c3545df599381509bfa2a60d58971d3c5b8cristy (void) RelinquishMagickMemory(image->colormap); 8261c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp image->colormap=NULL; 8262c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 826328af3713c9111a471cc868c787760de89236fa3cglennrp } 8264bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8265c28acd632b7ea1724a54191d15db932f2e4d25e6glennrp if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) 826616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) TransformImageColorspace(image,sRGBColorspace,exception); 82670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 82683241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp /* 82693241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp Sometimes we get PseudoClass images whose RGB values don't match 82703241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp the colors in the colormap. This code syncs the RGB values. 82713241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp */ 82723241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp if (image->depth <= 8 && image->taint && image->storage_class == PseudoClass) 827316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 82743241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8275a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 8276a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (image->depth > 8) 8277a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp { 8278a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 8279a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8280a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Reducing PNG bit depth to 8 since this is a Q8 build."); 8281a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8282a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp image->depth=8; 8283a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp } 8284a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 8285a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 82868e58efdecda887b08ef730d68290a61081ef2566glennrp /* Respect the -depth option */ 8287cd979955e4249aab3bdd79043718fa3b120239b8dirk if (image->depth < 4) 828867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp { 828916ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 82908e58efdecda887b08ef730d68290a61081ef2566glennrp *r; 82918e58efdecda887b08ef730d68290a61081ef2566glennrp 8292aac49630945ded4a68aca4f7c892e18b21afeba8dirk if (image->depth > 2) 82938e58efdecda887b08ef730d68290a61081ef2566glennrp { 82948e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 4-bit */ 829591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->background_color); 82968e58efdecda887b08ef730d68290a61081ef2566glennrp 82978e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 82988e58efdecda887b08ef730d68290a61081ef2566glennrp { 829916ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83008e58efdecda887b08ef730d68290a61081ef2566glennrp 830116ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83028e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83038e58efdecda887b08ef730d68290a61081ef2566glennrp 83048e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83058e58efdecda887b08ef730d68290a61081ef2566glennrp { 830616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PixelRGBA(r); 830716ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83088e58efdecda887b08ef730d68290a61081ef2566glennrp } 8309bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83108e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83118e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83128e58efdecda887b08ef730d68290a61081ef2566glennrp } 83138e58efdecda887b08ef730d68290a61081ef2566glennrp 83148e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83158e58efdecda887b08ef730d68290a61081ef2566glennrp { 83163e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83178e58efdecda887b08ef730d68290a61081ef2566glennrp { 831891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->colormap[i]); 83198e58efdecda887b08ef730d68290a61081ef2566glennrp } 83208e58efdecda887b08ef730d68290a61081ef2566glennrp } 83218e58efdecda887b08ef730d68290a61081ef2566glennrp } 83228e58efdecda887b08ef730d68290a61081ef2566glennrp else if (image->depth > 1) 83238e58efdecda887b08ef730d68290a61081ef2566glennrp { 83248e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 2-bit */ 832591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->background_color); 83268e58efdecda887b08ef730d68290a61081ef2566glennrp 83278e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 83288e58efdecda887b08ef730d68290a61081ef2566glennrp { 832916ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83308e58efdecda887b08ef730d68290a61081ef2566glennrp 833116ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83328e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83338e58efdecda887b08ef730d68290a61081ef2566glennrp 83348e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83358e58efdecda887b08ef730d68290a61081ef2566glennrp { 833616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PixelRGBA(r); 833716ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83388e58efdecda887b08ef730d68290a61081ef2566glennrp } 8339bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83408e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83418e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83428e58efdecda887b08ef730d68290a61081ef2566glennrp } 83438e58efdecda887b08ef730d68290a61081ef2566glennrp 83448e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83458e58efdecda887b08ef730d68290a61081ef2566glennrp { 83463e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83478e58efdecda887b08ef730d68290a61081ef2566glennrp { 834891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->colormap[i]); 83498e58efdecda887b08ef730d68290a61081ef2566glennrp } 83508e58efdecda887b08ef730d68290a61081ef2566glennrp } 83518e58efdecda887b08ef730d68290a61081ef2566glennrp } 83528e58efdecda887b08ef730d68290a61081ef2566glennrp else 83538e58efdecda887b08ef730d68290a61081ef2566glennrp { 83548e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 1-bit */ 835591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->background_color); 83568e58efdecda887b08ef730d68290a61081ef2566glennrp 83578e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 83588e58efdecda887b08ef730d68290a61081ef2566glennrp { 835916ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83608e58efdecda887b08ef730d68290a61081ef2566glennrp 836116ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83628e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83638e58efdecda887b08ef730d68290a61081ef2566glennrp 83648e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83658e58efdecda887b08ef730d68290a61081ef2566glennrp { 836616ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PixelRGBA(r); 836716ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83688e58efdecda887b08ef730d68290a61081ef2566glennrp } 8369bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83708e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83718e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83728e58efdecda887b08ef730d68290a61081ef2566glennrp } 83738e58efdecda887b08ef730d68290a61081ef2566glennrp 83748e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83758e58efdecda887b08ef730d68290a61081ef2566glennrp { 83763e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83778e58efdecda887b08ef730d68290a61081ef2566glennrp { 837891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->colormap[i]); 83798e58efdecda887b08ef730d68290a61081ef2566glennrp } 83808e58efdecda887b08ef730d68290a61081ef2566glennrp } 83818e58efdecda887b08ef730d68290a61081ef2566glennrp } 8382cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp } 8383cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp 838467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* To do: set to next higher multiple of 8 */ 838567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->depth < 8) 838670e68a844517efda3094dc170a8f54affc9c82bcglennrp image->depth=8; 8387a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 83882b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 83892b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 83902b013e4b9b602533eff410e61c3683fb2a3ab913glennrp * if lossy 83912b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 83928e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->depth > 8) 83932b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 83942b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 83952b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 83963faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 8397cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 8398cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 8399cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 8400cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 8401cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 8402cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 8403c722dd852e8abe407c2846d39662f7ade9c234deglennrp if (image->depth == 16 && mng_info->write_png_depth != 16) 840416ea139d53d867211d3bb0fa859a83de653f687ecristy if (mng_info->write_png8 || LosslessReduceDepthOK(image,exception) != MagickFalse) 84058640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 84068640fb5e9b1094f35f8beab436f81661b8a99448glennrp#endif 84078640fb5e9b1094f35f8beab436f81661b8a99448glennrp 8408d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp image_colors = (int) image->colors; 8409d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_opaque = (int) image->colors; 8410d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_transparent = 0; 8411d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_semitransparent = 0; 8412d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp 8413197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp if (mng_info->write_png_colortype && 8414a8036d6466b63ead629795b60772f160cca77c4cglennrp (mng_info->write_png_colortype > 4 || (mng_info->write_png_depth >= 8 && 8415a8036d6466b63ead629795b60772f160cca77c4cglennrp mng_info->write_png_colortype < 4 && 841617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy image->alpha_trait == UndefinedPixelTrait))) 8417a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8418a8036d6466b63ead629795b60772f160cca77c4cglennrp /* Avoid the expensive BUILD_PALETTE operation if we're sure that we 8419a8036d6466b63ead629795b60772f160cca77c4cglennrp * are not going to need the result. 8420a8036d6466b63ead629795b60772f160cca77c4cglennrp */ 8421a8036d6466b63ead629795b60772f160cca77c4cglennrp if (mng_info->write_png_colortype == 1 || 8422a8036d6466b63ead629795b60772f160cca77c4cglennrp mng_info->write_png_colortype == 5) 8423a8036d6466b63ead629795b60772f160cca77c4cglennrp ping_have_color=MagickFalse; 8424a8036d6466b63ead629795b60772f160cca77c4cglennrp 842517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 8426a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8427a8036d6466b63ead629795b60772f160cca77c4cglennrp number_transparent = 2; 8428a8036d6466b63ead629795b60772f160cca77c4cglennrp number_semitransparent = 1; 8429a8036d6466b63ead629795b60772f160cca77c4cglennrp } 8430a8036d6466b63ead629795b60772f160cca77c4cglennrp } 8431a8036d6466b63ead629795b60772f160cca77c4cglennrp 8432eb5cb8dae42f21ec99df00cae387c3308aba18e6glennrp if (mng_info->write_png_colortype < 7) 8433a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8434a8036d6466b63ead629795b60772f160cca77c4cglennrp /* BUILD_PALETTE 8435a8036d6466b63ead629795b60772f160cca77c4cglennrp * 8436a8036d6466b63ead629795b60772f160cca77c4cglennrp * Normally we run this just once, but in the case of writing PNG8 8437e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * we reduce the transparency to binary and run again, then if there 8438e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * are still too many colors we reduce to a simple 4-4-4-1, then 3-3-3-1 84398ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * RGBA palette and run again, and then to a simple 3-3-2-1 RGBA 84408ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * palette. Then (To do) we take care of a final reduction that is only 84418ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * needed if there are still 256 colors present and one of them has both 84428ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * transparent and opaque instances. 8443c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 844482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 84458ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickFalse; 844682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickFalse; 8447d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickFalse; 844882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 84498ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (j=0; j<6; j++) 8450d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8451a8036d6466b63ead629795b60772f160cca77c4cglennrp /* 8452d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get DirectClass images that have 256 colors or fewer. 8453d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will build a colormap. 8454d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8455d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also, sometimes we get PseudoClass images with an out-of-date 8456d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * colormap. This code will replace the colormap with a new one. 8457d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get PseudoClass images that have more than 256 colors. 8458d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will delete the colormap and change the image to 8459d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * DirectClass. 8460d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 84618a46d827a124555f0c48fb2368ec1bba8e079ab6cristy * If image->alpha_trait is MagickFalse, we ignore the alpha channel 8462d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * even though it sometimes contains left-over non-opaque values. 8463d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8464d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also we gather some information (number of opaque, transparent, 8465d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * and semitransparent pixels, and whether the image has any non-gray 8466d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixels or only black-and-white pixels) that we might need later. 8467d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8468d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Even if the user wants to force GrayAlpha or RGBA (colortype 4 or 6) 8469d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * we need to check for bogus non-opaque values, at least. 8470d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 84713c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8472d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp int 8473d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n; 84748bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 847516ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8476d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp opaque[260], 8477d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp semitransparent[260], 8478d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp transparent[260]; 84798bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 848016ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 848116ea139d53d867211d3bb0fa859a83de653f687ecristy *s; 8482d6bf1617e99df0272b231855a933a74e99b6578fglennrp 848316ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 848416ea139d53d867211d3bb0fa859a83de653f687ecristy *q, 8485fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *r; 8486fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8487d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8488d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8489d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Enter BUILD_PALETTE:"); 8490d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8491d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8492d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8493d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8494d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->columns=%.20g",(double) image->columns); 8495d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8496d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->rows=%.20g",(double) image->rows); 8497d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 84988a46d827a124555f0c48fb2368ec1bba8e079ab6cristy " image->alpha_trait=%.20g",(double) image->alpha_trait); 849903812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8500d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->depth=%.20g",(double) image->depth); 85013c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8502fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 85037ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 85047ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8505d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Original colormap:"); 85068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 850716ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 85082cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8509d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < 256; i++) 85107ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 8511d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8512d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8513d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8514d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8515d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8516d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 851716ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 85187ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp } 85192cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8520d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=image->colors - 10; i < (ssize_t) image->colors; i++) 8521d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8522d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i > 255) 8523d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8524d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8525d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8526d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8527d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8528d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8529d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 853016ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8531d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8532d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8533d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85342cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8535d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8536d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d",(int) image->colors); 853783c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8538d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colors == 0) 853916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 854016ea139d53d867211d3bb0fa859a83de653f687ecristy " (zero means unknown)"); 85417ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 85428d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap == MagickFalse) 85438d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85448d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp " Regenerate the colormap"); 8545d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85467ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 8547d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=0; 8548fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_opaque = 0; 8549fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_semitransparent = 0; 8550fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_transparent = 0; 85512cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8552d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8553d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8554d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 85557ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 855616ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8557d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 855897fd3d052fbd2e629d5d2387f26de9e250dd3e32glennrp 8559d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8560d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 856117f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait == UndefinedPixelTrait || 856216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q) == OpaqueAlpha) 85638d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8564d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259) 85658d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8566d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque == 0) 8567d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 856816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque); 856916ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[0].alpha=OpaqueAlpha; 8570d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque=1; 8571d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8572d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8573d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_opaque; i++) 8574d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 857568a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,opaque+i)) 8576d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8577d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8578d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 857916ea139d53d867211d3bb0fa859a83de653f687ecristy if (i == (ssize_t) number_opaque && number_opaque < 259) 8580d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8581d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque++; 858216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque+i); 858316ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[i].alpha=OpaqueAlpha; 8584d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85858d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 85868d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 858716ea139d53d867211d3bb0fa859a83de653f687ecristy else if (GetPixelAlpha(image,q) == TransparentAlpha) 85888d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8589d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 259) 85908d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8591d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent == 0) 8592d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 859316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, transparent); 859416ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red=(unsigned short) 859516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q); 859616ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green=(unsigned short) 859716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q); 859816ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue=(unsigned short) 859916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q); 860016ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.gray=(unsigned short) 8601972d1c4895c4ee6da1b6745e1bb9cb71ee5d6d08cristy GetPixelGray(image,q); 8602d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent = 1; 8603d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8604d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8605d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_transparent; i++) 8606d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 860768a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,transparent+i)) 8608d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8609d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8610d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8611d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_transparent && 8612d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent < 259) 8613d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8614d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent++; 861516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,transparent+i); 8616d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86178d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 86188d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 8619d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8620d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8621d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 259) 8622d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8623d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent == 0) 8624d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 862516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,semitransparent); 8626d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent = 1; 8627d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86288d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 8629d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_semitransparent; i++) 8630d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 863168a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,semitransparent+i) 863216ea139d53d867211d3bb0fa859a83de653f687ecristy && GetPixelAlpha(image,q) == 863316ea139d53d867211d3bb0fa859a83de653f687ecristy semitransparent[i].alpha) 8634d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8635d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8636d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8637d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_semitransparent && 8638d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent < 259) 8639d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8640d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent++; 864116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, semitransparent+i); 8642d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8643d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86448bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 864516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8646d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8647d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86483c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 86494054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png8 == MagickFalse && 86504054bfbdca478fe065f01d7f8285f7c173ccfcfccristy ping_exclude_bKGD == MagickFalse) 8651d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8652d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Add the background color to the palette, if it 8653d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * isn't already there. 8654d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8655c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8656c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8657c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8658c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Check colormap for background (%d,%d,%d)", 8659c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.red, 8660c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.green, 8661c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.blue); 8662c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8663d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8664d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8665ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp if (opaque[i].red == image->background_color.red && 8666ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].green == image->background_color.green && 8667ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].blue == image->background_color.blue) 8668ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp break; 8669d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8670d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259 && i == number_opaque) 867103812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 86728e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp opaque[i] = image->background_color; 8673c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index = i; 8674388a8c871db8f82488f34c4f41fc64a58b8cfbf7glennrp number_opaque++; 8675c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8676c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8677c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8678c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d",(int) i); 8679c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8680c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 868103812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 8682a080bc32a4a8b2ffec83fd836a28753959175363glennrp else if (logging != MagickFalse) 8683a080bc32a4a8b2ffec83fd836a28753959175363glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8684a080bc32a4a8b2ffec83fd836a28753959175363glennrp " No room in the colormap to add background color"); 8685d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86862cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8687d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=number_opaque+number_transparent+number_semitransparent; 86883241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8689d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8690d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8691d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors > 256) 8692d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8693d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has more than 256 colors"); 86943241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8695d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8696d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8697d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has %d colors",image_colors); 8698d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86993241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 87008d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap != MagickFalse) 87018d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp break; 87028d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 8703fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (mng_info->write_png_colortype != 7) /* We won't need this info */ 8704d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8705d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickFalse; 87060fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp ping_have_non_bw=MagickFalse; 87070fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp 870845d4c34ce93ff377b9671844ffa1153b821061f6glennrp if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) 87090fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp { 871096bc620815234aaec28b928df51d1754cbe390dcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 871196bc620815234aaec28b928df51d1754cbe390dcglennrp "incompatible colorspace"); 87127fb2652ba366fc984d1dbb0c66560b91c57dab78cristy ping_have_color=MagickTrue; 871398b95773e388844e22c6e4006bb88396b33cf6b4glennrp ping_have_non_bw=MagickTrue; 87140fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp } 87150fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp 8716d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if(image_colors > 256) 8717d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8718d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8719d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8720d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 87216185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 872216ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8723d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 87246185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8725e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp s=q; 8726e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp for (x=0; x < (ssize_t) image->columns; x++) 8727e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 872816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != GetPixelGreen(image,s) || 872916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != GetPixelBlue(image,s)) 8730e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 8731e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_color=MagickTrue; 8732e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_non_bw=MagickTrue; 8733e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8734e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 873516ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8736e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8737e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8738e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp if (ping_have_color != MagickFalse) 8739e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8740e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8741d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Worst case is black-and-white; we are looking at every 8742d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixel twice. 8743d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 87446185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8745d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8746d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8747d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp s=q; 8748d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 87496185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 875016ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != 0 && 875116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != QuantumRange) 8752d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8753d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8754e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8755d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 875616ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8757d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8758e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8759d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8760bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 8761bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 87624f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 8763d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors < 257) 8764d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 876516ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8766d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[260]; 8767bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8768d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* 8769d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Initialize image colormap. 8770d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8771d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8772d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8773d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8774d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Sort the new colormap"); 8775d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8776d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Sort palette, transparent first */; 8777d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8778d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n = 0; 87793241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8780d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_transparent; i++) 8781d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = transparent[i]; 87823241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8783d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_semitransparent; i++) 8784d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = semitransparent[i]; 8785d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8786d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8787d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = opaque[i]; 8788d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8789c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index += 8790c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (number_transparent + number_semitransparent); 8791bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8792d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* image_colors < 257; search the colormap instead of the pixels 8793d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * to get ping_have_color and ping_have_non_bw 8794d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8795d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<n; i++) 8796d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8797d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_color == MagickFalse) 8798d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8799d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != colormap[i].green || 8800d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[i].red != colormap[i].blue) 8801d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8802d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickTrue; 8803d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8804d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8805d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8806d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8807d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8808d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8809d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8810d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != 0 && colormap[i].red != QuantumRange) 8811d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8812d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8813d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 88143241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8815d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if ((mng_info->ping_exclude_tRNS == MagickFalse || 8816d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (number_transparent == 0 && number_semitransparent == 0)) && 8817d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (((mng_info->write_png_colortype-1) == 8818d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp PNG_COLOR_TYPE_PALETTE) || 8819d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (mng_info->write_png_colortype == 0))) 8820d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8821d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 88226185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 8823d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (n != (ssize_t) image_colors) 8824d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8825d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image_colors (%d) and n (%d) don't match", 8826d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors, n); 88272cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8828d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8829d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " AcquireImageColormap"); 8830d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8831d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8832d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colors = image_colors; 8833d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 883416ea139d53d867211d3bb0fa859a83de653f687ecristy if (AcquireImageColormap(image,image_colors,exception) == 8835d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp MagickFalse) 88363faa9a3fb01696daaf976d595f492cb530bffb21glennrp ThrowWriterException(ResourceLimitError, 88373faa9a3fb01696daaf976d595f492cb530bffb21glennrp "MemoryAllocationFailed"); 8838d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8839d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 8840d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colormap[i] = colormap[i]; 8841d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8842d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8843d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8844d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8845d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d (%d)", 8846d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colors, image_colors); 8847bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8848d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8849d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Update the pixel indexes"); 8850d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8851d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8852fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* Sync the pixel indices with the new colormap */ 8853fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8854d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8855d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 885616ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 88573c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 885816ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8859d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 88603c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8861d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8862d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8863d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 886403812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 886517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((image->alpha_trait == UndefinedPixelTrait || 886616ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha == GetPixelAlpha(image,q)) && 886716ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red == GetPixelRed(image,q) && 886816ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green == GetPixelGreen(image,q) && 886916ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue == GetPixelBlue(image,q)) 88706185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 887116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,i,q); 8872d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 88736185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 887403812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 887516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8876d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8877d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8878d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8879d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8880d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8881d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8882d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8883d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8884d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8885d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8886d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8887d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d", (int) image->colors); 8888d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8889d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colormap != NULL) 8890d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8891d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 889216ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 889383c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8894d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < (ssize_t) image->colors; i++) 8895d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 889672988485e53441bbc7e5e7fbcb8e81012212efb6cristy if (i < 300 || i >= (ssize_t) image->colors - 10) 8897d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8898d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8899d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8900d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8901d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8902d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8903d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 890416ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8905d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 89066185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 89076185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 89083c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8909d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 257) 8910d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8911d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent = %d", 8912d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent); 8913d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 89143c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8915d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8916d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent > 256"); 89173c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8918d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 257) 8919d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8920d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque = %d", 8921d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque); 892203812ae402fb53d548f0e1d7d14720768f803c2dglennrp 8923d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8924d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8925d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque > 256"); 89266185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8927d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 257) 8928d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8929d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent = %d", 8930d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent); 89316185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8932d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8933d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8934d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent > 256"); 8935a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8936d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8937d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8938d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are black or white"); 8939a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8940d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else if (ping_have_color == MagickFalse) 8941d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8942d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are gray"); 8943d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8944d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8945d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8946d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " At least one pixel or the background is non-gray"); 89476185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 894803812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 894903812ae402fb53d548f0e1d7d14720768f803c2dglennrp " Exit BUILD_PALETTE:"); 8950d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 89513c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8952c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (mng_info->write_png8 == MagickFalse) 8953c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8954fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8955c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* Make any reductions necessary for the PNG8 format */ 8956c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors <= 256 && 8957c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image_colors != 0 && image->colormap != NULL && 8958c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_semitransparent == 0 && 8959c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_transparent <= 1) 8960c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8961fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8962c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have semitransparent colors so we threshold the 8963130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * opacity to 0 or OpaqueOpacity, and PNG8 can only have one 8964130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * transparent color so if more than one is transparent we merge 8965130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * them into image->background_color. 8966c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 8967130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp if (number_semitransparent != 0 || number_transparent > 1) 8968c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8969c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8970c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Thresholding the alpha channel to binary"); 8971fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8972c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 8973c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 897416ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8975fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 897616ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 8977c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8978fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8979c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 8980c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 898116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) < OpaqueAlpha/2) 89828ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 898311a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy SetPixelViaPixelInfo(image,&image->background_color,r); 898416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,r); 89858ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 89868ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 898716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,OpaqueAlpha,r); 898816ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 8989c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 8990bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8991c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8992c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8993fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8994c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors != 0 && image_colors <= 256 && 8995c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image->colormap != NULL) 8996c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 899716ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha = 899816ea139d53d867211d3bb0fa859a83de653f687ecristy (image->colormap[i].alpha > TransparentAlpha/2 ? 899916ea139d53d867211d3bb0fa859a83de653f687ecristy TransparentAlpha : OpaqueAlpha); 9000c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9001c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 9002c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9003c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 9004c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have more than 256 colors so we quantize the pixels and 9005e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * background color to the 4-4-4-1, 3-3-3-1 or 3-3-2-1 palette. If the 9006e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * image is mostly gray, the 4-4-4-1 palette is likely to end up with 256 9007e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * colors or less. 9008c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 9009d337164012450d70d62e71cf4a308a29004f7d57glennrp if (tried_444 == MagickFalse && (image_colors == 0 || image_colors > 256)) 9010d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9011d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9012d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9013d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the background color to 4-4-4"); 9014d337164012450d70d62e71cf4a308a29004f7d57glennrp 9015d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickTrue; 9016d337164012450d70d62e71cf4a308a29004f7d57glennrp 901791d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->background_color); 9018d337164012450d70d62e71cf4a308a29004f7d57glennrp 9019d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9020d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9021d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the pixel colors to 4-4-4"); 9022d337164012450d70d62e71cf4a308a29004f7d57glennrp 9023d337164012450d70d62e71cf4a308a29004f7d57glennrp if (image->colormap == NULL) 9024d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9025d337164012450d70d62e71cf4a308a29004f7d57glennrp for (y=0; y < (ssize_t) image->rows; y++) 9026d337164012450d70d62e71cf4a308a29004f7d57glennrp { 902716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 9028d337164012450d70d62e71cf4a308a29004f7d57glennrp 902916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 9030d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 9031d337164012450d70d62e71cf4a308a29004f7d57glennrp 9032d337164012450d70d62e71cf4a308a29004f7d57glennrp for (x=0; x < (ssize_t) image->columns; x++) 9033d337164012450d70d62e71cf4a308a29004f7d57glennrp { 903416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 903554cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelRGB(r); 903616ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 9037d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9038bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9039d337164012450d70d62e71cf4a308a29004f7d57glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 9040d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 9041d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9042d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9043d337164012450d70d62e71cf4a308a29004f7d57glennrp 9044d337164012450d70d62e71cf4a308a29004f7d57glennrp else /* Should not reach this; colormap already exists and 9045d337164012450d70d62e71cf4a308a29004f7d57glennrp must be <= 256 */ 9046d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9047d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9048d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9049d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the colormap to 4-4-4"); 90508e58efdecda887b08ef730d68290a61081ef2566glennrp 9051d337164012450d70d62e71cf4a308a29004f7d57glennrp for (i=0; i<image_colors; i++) 9052d337164012450d70d62e71cf4a308a29004f7d57glennrp { 905391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->colormap[i]); 9054d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9055d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9056d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 9057d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9058d337164012450d70d62e71cf4a308a29004f7d57glennrp 905982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (tried_333 == MagickFalse && (image_colors == 0 || image_colors > 256)) 906082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 906182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 906282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 906382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp " Quantizing the background color to 3-3-3"); 906482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 906582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickTrue; 906682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 906791d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->background_color); 906882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 906982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 907082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9071e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-3-1"); 907282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 907382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (image->colormap == NULL) 907482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 907582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (y=0; y < (ssize_t) image->rows; y++) 907682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 907716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 907882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 907916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 908082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 908182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 908282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (x=0; x < (ssize_t) image->columns; x++) 908382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 908416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 908516ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03RGB(r); 908616ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 908782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9088bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 908982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 909082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 909182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 909282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 909382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 909482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp else /* Should not reach this; colormap already exists and 909582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp must be <= 256 */ 909682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 909782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 909882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9099e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-3-1"); 910082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (i=0; i<image_colors; i++) 910182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 910291d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->colormap[i]); 910382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9104d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9105d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 910682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9107c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 91088ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (tried_332 == MagickFalse && (image_colors == 0 || image_colors > 256)) 9109c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9110c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9111c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9112c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Quantizing the background color to 3-3-2"); 9113c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 91148ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickTrue; 91158ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 91163faa9a3fb01696daaf976d595f492cb530bffb21glennrp /* Red and green were already done so we only quantize the blue 91173faa9a3fb01696daaf976d595f492cb530bffb21glennrp * channel 91183faa9a3fb01696daaf976d595f492cb530bffb21glennrp */ 91193faa9a3fb01696daaf976d595f492cb530bffb21glennrp 912091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->background_color); 9121fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9122c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9123c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9124e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-2-1"); 9125fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9126c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image->colormap == NULL) 9127c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9128c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 9129c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 913016ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 91318d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 913216ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 9133c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 9134c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 9135c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 9136c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 913716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 913854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelBlue(r); 913916ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 9140c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9141bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9142c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 9143c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 9144c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9145c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9146c722dd852e8abe407c2846d39662f7ade9c234deglennrp 9147c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp else /* Should not reach this; colormap already exists and 9148c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp must be <= 256 */ 9149c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9150c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9151c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9152e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-2-1"); 9153c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 9154c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 915591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->colormap[i]); 9156c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9157c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9158c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 9159c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 91608ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 91618ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image_colors == 0 || image_colors > 256) 91628ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 916334ef720923a27004960cbcf4d75a8075445e85d7glennrp /* Take care of special case with 256 opaque colors + 1 transparent 91648ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * color. We don't need to quantize to 2-3-2-1; we only need to 91658ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * eliminate one color, so we'll merge the two darkest red 91668ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * colors (0x49, 0, 0) -> (0x24, 0, 0). 91678ca51ad2da164dabc55b192ed7884b745fde0e26glennrp */ 916834ef720923a27004960cbcf4d75a8075445e85d7glennrp if (logging != MagickFalse) 916934ef720923a27004960cbcf4d75a8075445e85d7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 917034ef720923a27004960cbcf4d75a8075445e85d7glennrp " Merging two dark red background colors to 3-3-2-1"); 917134ef720923a27004960cbcf4d75a8075445e85d7glennrp 91728ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->background_color.red) == 0x49 && 91738ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.green) == 0x00 && 91748ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.blue) == 0x00) 91758ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 91768ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->background_color.red=ScaleCharToQuantum(0x24); 91778ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9178bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 917934ef720923a27004960cbcf4d75a8075445e85d7glennrp if (logging != MagickFalse) 918034ef720923a27004960cbcf4d75a8075445e85d7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 918134ef720923a27004960cbcf4d75a8075445e85d7glennrp " Merging two dark red pixel colors to 3-3-2-1"); 918234ef720923a27004960cbcf4d75a8075445e85d7glennrp 91838ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image->colormap == NULL) 91848ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 91858ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (y=0; y < (ssize_t) image->rows; y++) 91868ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 918716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 9188bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 918916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 91908ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 9191bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 91928ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (x=0; x < (ssize_t) image->columns; x++) 91938ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 919416ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToChar(GetPixelRed(image,r)) == 0x49 && 919516ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelGreen(image,r)) == 0x00 && 919616ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,r)) == 0x00 && 919716ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,r) == OpaqueAlpha) 91988ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 919916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleCharToQuantum(0x24),r); 92008ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 920116ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 92028ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9203bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 92048ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 92058ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 9206bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 92078ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92088ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92098ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 92108ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 92118ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92128ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (i=0; i<image_colors; i++) 92138ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92148ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->colormap[i].red) == 0x49 && 92158ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].green) == 0x00 && 92168ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].blue) == 0x00) 92178ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92188ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->colormap[i].red=ScaleCharToQuantum(0x24); 92198ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92208ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92218ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92228ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9223fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9224a8036d6466b63ead629795b60772f160cca77c4cglennrp } 9225fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* END OF BUILD_PALETTE */ 9226fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9227fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* If we are excluding the tRNS chunk and there is transparency, 9228fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * then we must write a Gray-Alpha (color-type 4) or RGBA (color-type 6) 9229fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * PNG. 9230fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 92310e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (mng_info->ping_exclude_tRNS != MagickFalse && 92320e8ea19baa0666ccfe869d19116372f60fe9230fglennrp (number_transparent != 0 || number_semitransparent != 0)) 92330e8ea19baa0666ccfe869d19116372f60fe9230fglennrp { 9234d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp unsigned int colortype=mng_info->write_png_colortype; 92350e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92360e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (ping_have_color == MagickFalse) 92370e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 5; 92380e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92390e8ea19baa0666ccfe869d19116372f60fe9230fglennrp else 92400e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 7; 92410e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92428d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (colortype != 0 && 9243d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp mng_info->write_png_colortype != colortype) 92440e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning=MagickTrue; 92450b206f5daa453dc1035db5890cabc899736dc2d0glennrp 92460e8ea19baa0666ccfe869d19116372f60fe9230fglennrp } 92470e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 9248fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* See if cheap transparency is possible. It is only possible 9249fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * when there is a single transparent color, no semitransparent 9250fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * color, and no opaque color that has the same RGB components 92515a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * as the transparent color. We only need this information if 92525a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * we are writing a PNG with colortype 0 or 2, and we have not 92535a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * excluded the tRNS chunk. 9254fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 92555a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp if (number_transparent == 1 && 92565a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp mng_info->write_png_colortype < 4) 9257fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9258fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickTrue; 9259fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9260fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (number_semitransparent != 0) 9261fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9262fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9263fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else if (image_colors == 0 || image_colors > 256 || 9264fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp image->colormap == NULL) 9265fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 926616ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 9267fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *q; 9268fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9269fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (y=0; y < (ssize_t) image->rows; y++) 9270fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9271fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp q=GetVirtualPixels(image,0,y,image->columns,1, exception); 9272fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 927316ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 9274fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9275fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9276fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (x=0; x < (ssize_t) image->columns; x++) 9277fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 927816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != TransparentAlpha && 927916ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelRed(image,q) == 928016ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red && 928116ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelGreen(image,q) == 928216ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green && 928316ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelBlue(image,q) == 928416ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue) 9285fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9286fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9287fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9288fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9289fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 929016ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 9291fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9292bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9293fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9294fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9295fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9296fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9297fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9298fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 929967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* Assuming that image->colormap[0] is the one transparent color 930067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * and that all others are opaque. 930167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp */ 9302fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image_colors > 1) 930367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp for (i=1; i<image_colors; i++) 930467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->colormap[i].red == image->colormap[0].red && 930567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].green == image->colormap[0].green && 930667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].blue == image->colormap[0].blue) 9307fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 930867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp ping_have_cheap_transparency = MagickFalse; 930967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp break; 9310fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9311fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9312bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9313fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 9314fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9315fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9316fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9317fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is not possible."); 9318fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9319fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9320fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9321fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is possible."); 9322fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9323fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9324fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9325fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9326fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 93273c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp image_depth=image->depth; 93283c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 93293c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp quantum_info = (QuantumInfo *) NULL; 93303c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp number_colors=0; 9331f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) image->colors; 933217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy image_matte=image->alpha_trait != UndefinedPixelTrait ? MagickTrue : MagickFalse; 933383c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 933448c20621d4ce02a3833b107f710843d1e524d559glennrp if (mng_info->write_png_colortype < 5) 9335197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp mng_info->IsPalette=image->storage_class == PseudoClass && 9336197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp image_colors <= 256 && image->colormap != NULL; 9337197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp else 9338197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp mng_info->IsPalette = MagickFalse; 93393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 934052a479ca718756af72f96e127f8256499ab68f76glennrp if ((mng_info->write_png_colortype == 4 || mng_info->write_png8) && 934152a479ca718756af72f96e127f8256499ab68f76glennrp (image->colors == 0 || image->colormap == NULL)) 934252a479ca718756af72f96e127f8256499ab68f76glennrp { 934316ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 934416ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 934516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 934615e0155e1d2502703b937a3454bd7907e6fd8dc7glennrp "Cannot write PNG8 or color-type 3; colormap is NULL", 934716ea139d53d867211d3bb0fa859a83de653f687ecristy "`%s'",IMimage->filename); 934852a479ca718756af72f96e127f8256499ab68f76glennrp return(MagickFalse); 934952a479ca718756af72f96e127f8256499ab68f76glennrp } 935052a479ca718756af72f96e127f8256499ab68f76glennrp 93513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 93533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 935516ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.image=image; 935616ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.exception=exception; 93573e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_write_struct_2(PNG_LIBPNG_VER_STRING,&error_info, 9358cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler,(void *) NULL, 9359cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); 93600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 93623e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_write_struct(PNG_LIBPNG_VER_STRING,&error_info, 9363cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler); 93640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 93663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 93673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 93680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 93700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 93723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,(png_info **) NULL); 93743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 93753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_write_fn(ping,image,png_put_data,png_flush_data); 93780997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=(MemoryInfo *) NULL; 93793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 93805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (setjmp(png_jmpbuf(ping))) 93813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG write failed. 93843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_DEBUG 93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("PNG write has failed.\n"); 93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 93893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 9390868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 9391cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9393edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 93940997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info != (MemoryInfo *) NULL) 93950997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 9396edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9397edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp if (quantum_info != (QuantumInfo *) NULL) 9398edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp quantum_info=DestroyQuantumInfo(quantum_info); 9399edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 940016ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 940116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 940216ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 940316ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 94043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9406edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9407edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* { For navigation to end of SETJMP-protected block. Within this 9408edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * block, use png_error() instead of Throwing an Exception, to ensure 9409edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * that libpng is able to clean up, and that the semaphore is unlocked. 9410edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 9411edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9412868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 9413edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp LockSemaphoreInfo(ping_semaphore); 9414edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 9415edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9416943b7d3decdd71b57fba7c2fe73fa26f380d692fglennrp#ifdef PNG_BENIGN_ERRORS_SUPPORTED 9417a3a5f956194e91458e2789966ad15308e8f3df47glennrp /* Allow benign errors */ 9418a3a5f956194e91458e2789966ad15308e8f3df47glennrp png_set_benign_errors(ping, 1); 9419a3a5f956194e91458e2789966ad15308e8f3df47glennrp#endif 9420a3a5f956194e91458e2789966ad15308e8f3df47glennrp 9421f9eb20453e3475d44a3833f64c4a662c0106c43edirk#ifdef PNG_SET_USER_LIMITS_SUPPORTED 9422f9eb20453e3475d44a3833f64c4a662c0106c43edirk /* Reject images with too many rows or columns */ 9423f9eb20453e3475d44a3833f64c4a662c0106c43edirk png_set_user_limits(ping, 9424f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 9425f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(WidthResource)), 9426f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 9427f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(HeightResource))); 9428f9eb20453e3475d44a3833f64c4a662c0106c43edirk#endif /* PNG_SET_USER_LIMITS_SUPPORTED */ 9429f9eb20453e3475d44a3833f64c4a662c0106c43edirk 94303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for writing. 94323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94339bf97b6c2143eb20c330346b01e82102cc082725glennrp 94343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 94353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 943625024a6b81adca7509dfd90b03c27dbb42c5889bglennrp { 94373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 943825024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED 943925024a6b81adca7509dfd90b03c27dbb42c5889bglennrp /* Disable new libpng-1.5.10 feature when writing a MNG because 944025024a6b81adca7509dfd90b03c27dbb42c5889bglennrp * zero-length PLTE is OK 944125024a6b81adca7509dfd90b03c27dbb42c5889bglennrp */ 944225024a6b81adca7509dfd90b03c27dbb42c5889bglennrp png_set_check_for_invalid_index (ping, 0); 944325024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# endif 944425024a6b81adca7509dfd90b03c27dbb42c5889bglennrp } 94452b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 94493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 94502b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 94523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 94532b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x=0; 94552b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94564e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_width=(png_uint_32) image->columns; 94574e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_height=(png_uint_32) image->rows; 94582b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) 94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 94610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9462fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png48 || mng_info->write_png64) 9463fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image_depth=16; 9464fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth != 0) 94663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=mng_info->write_png_depth; 94670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Adjust requested depth to next higher valid depth if necessary */ 94693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 94703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=16; 94710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_depth > 4) && (image_depth < 8)) 94733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 94740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 3) 94763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=4; 94770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 94793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9481e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " width=%.20g",(double) ping_width); 94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9483e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " height=%.20g",(double) ping_height); 94843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 94858a46d827a124555f0c48fb2368ec1bba8e079ab6cristy " image_matte=%.20g",(double) image->alpha_trait); 94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 94878640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth=%.20g",(double) image->depth); 94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 94898640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Tentative ping_bit_depth=%.20g",(double) image_depth); 94903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 94918640fb5e9b1094f35f8beab436f81661b8a99448glennrp 94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth=image_depth; 94935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=(png_byte) save_image_depth; 9494dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 949526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 94963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 949726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 949826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 949916ea139d53d867211d3bb0fa859a83de653f687ecristy if ((image->resolution.x != 0) && (image->resolution.y != 0) && 95003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_mng || !mng_info->equal_physs)) 95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 9503dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9504dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp " Setting up pHYs chunk"); 95053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 95073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9508dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 9509823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_x_resolution= 951016ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.x+0.5)/2.54); 9511823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_y_resolution= 951216ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.y+0.5)/2.54); 95133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9514dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 95153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (image->units == PixelsPerCentimeterResolution) 95163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9517dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 951816ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) (100.0*image->resolution.x+0.5); 951916ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) (100.0*image->resolution.y+0.5); 95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9521991d11dd9c33e65872778b81aff1347cd2878154glennrp 95223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 95233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9524dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_UNKNOWN; 952516ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) image->resolution.x; 952616ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) image->resolution.y; 95273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9528991d11dd9c33e65872778b81aff1347cd2878154glennrp 9529823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (logging != MagickFalse) 9530823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9531823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Set up PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 9532823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (double) ping_pHYs_x_resolution,(double) ping_pHYs_y_resolution, 9533823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (int) ping_pHYs_unit_type); 9534991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs = MagickTrue; 95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 953626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 95373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9538a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 953926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 954026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 9541a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if ((!mng_info->adjoin || !mng_info->equal_backgrounds)) 95423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9543a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp unsigned int 9544a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask; 9545a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 9546a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0xffff; 9547a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 8) 9548a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x00ff; 95490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9550a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 4) 9551a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x000f; 95520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9553a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 2) 9554a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0003; 95550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9556a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 1) 9557a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0001; 95580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9559a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.red=(png_uint_16) 9560a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.red) & mask); 95610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9562a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.green=(png_uint_16) 9563a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.green) & mask); 95640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9565a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.blue=(png_uint_16) 9566a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.blue) & mask); 9567c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9568c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.gray=(png_uint_16) ping_background.green; 95690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 95700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 95723b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp { 95733b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95743b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Setting up bKGD chunk (1)"); 9575c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9576c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9577c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 95783b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 95793b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95803b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " ping_bit_depth=%d",ping_bit_depth); 95813b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp } 95820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 958426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 95853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 95873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Select the color type. 95883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 95893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 95903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_bit_depth=0; 95910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95921273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && mng_info->write_png8) 95933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9594fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: make this a function cause it's used twice, except 95950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for reducing the sample depth from 8. */ 95960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp number_colors=image_colors; 95988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 95998bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickFalse; 96000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 96020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Set image palette. 96030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 96040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 96050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 96070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 96080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up PLTE chunk with %d colors (%d)", 9609f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, image_colors); 96100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (i=0; i < (ssize_t) number_colors; i++) 96120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 96130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 96140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 96150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 96160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 96170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 961867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if MAGICKCORE_QUANTUM_DEPTH == 8 96190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " %3ld (%3d,%3d,%3d)", 962067b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#else 962167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp " %5ld (%5d,%5d,%5d)", 962267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#endif 96230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (long) i,palette[i].red,palette[i].green,palette[i].blue); 96243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 96262b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 96278bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_PLTE=MagickTrue; 96288bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=ping_bit_depth; 96298bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_num_trans=0; 96305af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 963158e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 96328bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 96330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 96340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Identify which colormap entry is transparent. 96350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 96360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 96378bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp assert(image->colormap != NULL); 96383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96398bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (i=0; i < (ssize_t) number_transparent; i++) 96408bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_trans_alpha[i]=0; 96410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96432cc891a179d622dde7bbb8854138851e828bc6eaglennrp ping_num_trans=(unsigned short) (number_transparent + 96448bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent); 96450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 96470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 96480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96498bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 96508bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickTrue; 96518bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 96520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96531273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (ping_exclude_bKGD == MagickFalse) 96544f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 96551273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp /* 96561273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp * Identify which colormap entry is the background color. 96571273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp */ 96581273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp 96594f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) 96604f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (IsPNGColorEqual(ping_background,image->colormap[i])) 96614f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 96620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96634f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_background.index=(png_byte) i; 9664c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9665c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 9666c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 9667c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9668c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9669c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 9670c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 96714f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 96723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* end of write_png8 */ 96730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9674fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png_colortype == 1) 9675fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 9676fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image_matte=MagickFalse; 9677fd164d2bf84b111e304959af5698757d60e9b8aeglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 9678fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 9679fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 9680fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png24 || mng_info->write_png48 || 9681fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype == 3) 96823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 96845af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 96853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9687fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png32 || mng_info->write_png64 || 9688fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype == 7) 96893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 96915af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 96923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96948bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* mng_info->write_pngNN not specified */ 96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 96970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->write_png_colortype != 0) 96993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) mng_info->write_png_colortype-1; 97010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97025af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 97035af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 97043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 97052cc891a179d622dde7bbb8854138851e828bc6eaglennrp 97068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 97078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_matte=MagickFalse; 97087c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 97097c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (logging != MagickFalse) 97107c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97117c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp " PNG colortype %d was specified:",(int) ping_color_type); 97123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97147c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else /* write_png_colortype not specified */ 97153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97183c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp " Selecting PNG colortype:"); 97190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9720d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_color_type=(png_byte) ((matte != MagickFalse)? 97218bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp PNG_COLOR_TYPE_RGB_ALPHA:PNG_COLOR_TYPE_RGB); 97220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9723d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (image_info->type == TrueColorType) 97243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97255af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 97263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 97273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9729def23e5d7331b1a13ed593b6d6aca516da382328cristy if (image_info->type == TrueColorAlphaType) 97303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97315af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 97323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 97333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97355aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_info->type == PaletteType || 9736def23e5d7331b1a13ed593b6d6aca516da382328cristy image_info->type == PaletteAlphaType) 97375aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 97385aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 97397c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0 && 9740261f64eea2c3a5a9586da65af2c59d2a39b05de0glennrp image_info->type == UndefinedType) 97413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97425aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (ping_have_color == MagickFalse) 97438bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 97445aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 97455aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97465aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 97475aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 97485aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97500b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 97515aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97525aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY_ALPHA; 97535aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 97545aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97558bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 97565aa37f69df93407ddf94afdfd2504f708d8b3242glennrp else 97575aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97585aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 97595aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97605aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 97615aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 97625aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97638bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 97640b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 97655aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97665aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGBA; 97675aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 97685aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97695aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 97715aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 97723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 977526c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97768640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Selected PNG colortype=%d",ping_color_type); 977726c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp 97785af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 97790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 97800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 97810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB || 97820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 97830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=8; 97840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 97853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9786d6bf1617e99df0272b231855a933a74e99b6578fglennrp old_bit_depth=ping_bit_depth; 9787d6bf1617e99df0272b231855a933a74e99b6578fglennrp 97885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 97893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 979017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait == UndefinedPixelTrait && ping_have_non_bw == MagickFalse) 97918d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_bit_depth=1; 97923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97938640fb5e9b1094f35f8beab436f81661b8a99448glennrp 97945af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 97953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 979635ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one = 1; 97975af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 97980f111984738842d27d04aed2a3f823d82a943506glennrp 97990f111984738842d27d04aed2a3f823d82a943506glennrp if (image->colors == 0) 98000f111984738842d27d04aed2a3f823d82a943506glennrp { 98010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* DO SOMETHING */ 9802edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"image has 0 colors"); 98030f111984738842d27d04aed2a3f823d82a943506glennrp } 98040f111984738842d27d04aed2a3f823d82a943506glennrp 980535ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) < (ssize_t) image_colors) 98065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 9807d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 98083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9809d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (logging != MagickFalse) 9810d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 9811d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9812d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Number of colors: %.20g",(double) image_colors); 98130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9814d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9815d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Tentative PNG bit depth: %d",ping_bit_depth); 9816d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 98170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9818d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (ping_bit_depth < (int) mng_info->write_png_depth) 9819d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_bit_depth = mng_info->write_png_depth; 98203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 98212cc891a179d622dde7bbb8854138851e828bc6eaglennrp 98225af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 98232b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 98253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 98263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98271a56e9c9268976936eeab9fe97eb664b847e444cglennrp " Tentative PNG color type: %s (%.20g)", 98281a56e9c9268976936eeab9fe97eb664b847e444cglennrp PngColorTypeToString(ping_color_type), 98291a56e9c9268976936eeab9fe97eb664b847e444cglennrp (double) ping_color_type); 98300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9832e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_info->type: %.20g",(double) image_info->type); 98330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9835e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_depth: %.20g",(double) image_depth); 98360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98383c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 98398640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth: %.20g",(double) image->depth); 98408640fb5e9b1094f35f8beab436f81661b8a99448glennrp 98418640fb5e9b1094f35f8beab436f81661b8a99448glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9842e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " ping_bit_depth: %.20g",(double) ping_bit_depth); 98433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 98443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 984558e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 98463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 98474f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (mng_info->IsPalette) 98484f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98497c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 98507c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp { 98517c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 98522b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98537c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (ping_have_color != MagickFalse) 98547c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_RGBA; 98557c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp } 98562b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 98584f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp * Determine if there is any transparent color. 98593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 98604f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (number_transparent + number_semitransparent == 0) 98614f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98624f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 98634f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp No transparent pixels are present. Change 4 or 6 to 0 or 2. 98644f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp */ 9865a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 98664f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image_matte=MagickFalse; 98677c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 98687c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 98697c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type&=0x03; 98704f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 98710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98724f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 98734f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98744f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp unsigned int 9875bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp mask; 98763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 98774f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0xffff; 98780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98794f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 8) 98804f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x00ff; 98810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98824f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 4) 98834f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x000f; 98840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98854f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 2) 98864f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0003; 98870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98884f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 1) 98894f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0001; 98900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98914f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red=(png_uint_16) 98924f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].red) & mask); 98930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98944f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green=(png_uint_16) 98954f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].green) & mask); 98960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98974f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue=(png_uint_16) 98984f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].blue) & mask); 98990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99004f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray=(png_uint_16) 990111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy (ScaleQuantumToShort(GetPixelInfoIntensity(image, 99024f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image->colormap)) & mask); 99030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99044f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.index=(png_byte) 0; 99050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99064f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_have_tRNS=MagickTrue; 99074f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99094f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 99104f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99114f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 9912fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * Determine if there is one and only one transparent color 9913fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * and if so if it is fully transparent. 9914fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 9915fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9916fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_tRNS=MagickFalse; 99174f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99182b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 99194f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 99204f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99217c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 99227c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type &= 0x03; /* changes 4 or 6 to 0 or 2 */ 99230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99244f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (image_depth == 8) 99254f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99264f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red&=0xff; 99274f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green&=0xff; 99284f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue&=0xff; 99294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray&=0xff; 99304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99314f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99324f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 99344f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 8) 99363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red&=0xff; 99385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green&=0xff; 99395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue&=0xff; 99405af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray&=0xff; 99413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99448640fb5e9b1094f35f8beab436f81661b8a99448glennrp 99453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 99460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99472e09f55407bbe197cbaf4f88b1d7265f62d7f6c7glennrp if (ping_have_tRNS != MagickFalse) 99483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 99490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 995039992b4dd9b12ef752d55b8e402c069698851f72glennrp if ((mng_info->IsPalette) && 99513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE && 99528d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_color == MagickFalse && 99538d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp (image_matte == MagickFalse || image_depth >= 8)) 99543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 995535ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one=1; 99560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte != MagickFalse) 99589c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 99590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99607c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_GRAY_ALPHA) 99613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99625af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=PNG_COLOR_TYPE_GRAY; 99634f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 99643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (save_image_depth == 16 && image_depth == 8) 99654f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99664f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 99674f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99684f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99694f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color (0)"); 99704f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99714f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray*=0x0101; 99724f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > MAGICKCORE_QUANTUM_DEPTH) 99763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=MAGICKCORE_QUANTUM_DEPTH; 99770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9978136ee3aa5987c7418c835f7ee741e1af1dadb113glennrp if ((image_colors == 0) || 9979d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp ((ssize_t) (image_colors-1) > (ssize_t) MaxColormapSize)) 9980f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) (one << image_depth); 99810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 99835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=16; 99840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 99863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 99885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 99893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(!mng_info->write_png_depth) 99913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99925af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 99930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 999435ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) 9995bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy < (ssize_t) image_colors) 99965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 99973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99992b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == 100010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp PNG_COLOR_TYPE_GRAY && image_colors < 17 && 100023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette) 100033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if grayscale is reducible */ 100051a0aaa639fb2360f2db93f9b0ed2b42ef6d2106dglennrp 100063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 100073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=MagickTrue, 100083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=MagickTrue, 100093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickTrue; 100103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10011bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image_colors; i++) 100123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 100143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity; 100153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity=ScaleQuantumToChar(image->colormap[i].red); 100173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((intensity & 0x0f) != ((intensity & 0xf0) >> 4)) 100193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=depth_2_ok=depth_1_ok=MagickFalse; 100203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if ((intensity & 0x03) != ((intensity & 0x0c) >> 2)) 100213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=depth_1_ok=MagickFalse; 100224bf89731a90c6e03598950223e19e7be7b95d630glennrp else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) 100233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickFalse; 100243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100252b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth_1_ok && mng_info->write_png_depth <= 1) 100279c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=1; 100280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_2_ok && mng_info->write_png_depth <= 2) 100309c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=2; 100310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_4_ok && mng_info->write_png_depth <= 4) 100339c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=4; 100343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100362b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 100383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 100410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 100433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1004417a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 1004517a1485544c62993fc7a94e343c87fed5f3e6407glennrp 100463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth <= 8) 100473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 100493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image palette. 100503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 100515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 100520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100533d627862fb79aad8a20be4f1587f0b8761db441aglennrp if (!(mng_info->have_write_global_plte && matte == MagickFalse)) 100543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10055bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 100563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 100583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 100593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 100603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100623b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 100633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1006498156a3a465a004545e39434c63052b955a74d1cglennrp " Setting up PLTE chunk with %d colors", 10065f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors); 100660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1006739992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickTrue; 100683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* color_type is PNG_COLOR_TYPE_PALETTE */ 10071d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (mng_info->write_png_depth == 0) 100723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10073befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 10074befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 10075befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 100765af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 10077befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 100780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1007916ea139d53d867211d3bb0fa859a83de653f687ecristy while ((one << ping_bit_depth) < (size_t) number_colors) 100805af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 100813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 100840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1008558e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 100860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 100870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 10088d6bf1617e99df0272b231855a933a74e99b6578fglennrp * Set up trans_colors array. 10089d6bf1617e99df0272b231855a933a74e99b6578fglennrp */ 100900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 100913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10092d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_num_trans=(unsigned short) (number_transparent + 10093d6bf1617e99df0272b231855a933a74e99b6578fglennrp number_semitransparent); 100943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 100960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 100970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10098d6bf1617e99df0272b231855a933a74e99b6578fglennrp else 100990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 10100c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10101c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10102c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10103c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Scaling ping_trans_color (1)"); 10104c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10105d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_tRNS=MagickTrue; 10106d6bf1617e99df0272b231855a933a74e99b6578fglennrp 10107d6bf1617e99df0272b231855a933a74e99b6578fglennrp for (i=0; i < ping_num_trans; i++) 10108d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 10109750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp ping_trans_alpha[i]= (png_byte) 1011016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(image->colormap[i].alpha); 10111d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 101120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 101130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 101143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 101183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10119c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 101203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth < 8) 101213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 101220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((save_image_depth == 16) && (image_depth == 8)) 101243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101254f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 101264f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 101274f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101284f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color from (%d,%d,%d)", 101294f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 101304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 101314f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 101324f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 101334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 101345af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red*=0x0101; 101355af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green*=0x0101; 101365af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue*=0x0101; 101375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray*=0x0101; 101384f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 101394f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 101404f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 101414f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101424f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " to (%d,%d,%d)", 101434f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 101444f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 101454f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 101464f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 101473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101504383ec8c3c8811128f5a8a034d67c47db5e7e75acristy if (ping_bit_depth < (ssize_t) mng_info->write_png_depth) 101514383ec8c3c8811128f5a8a034d67c47db5e7e75acristy ping_bit_depth = (ssize_t) mng_info->write_png_depth; 101522cc891a179d622dde7bbb8854138851e828bc6eaglennrp 101533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 101543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Adjust background and transparency samples in sub-8-bit grayscale files. 101553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 101565af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8 && ping_color_type == 101573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_GRAY) 101583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 101603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval; 101613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1016235ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 1016335ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 1016435ef824baa82511126ff0072ae30eee0da9c05a3cristy 1016522ffd97a7a54140ebcfe886af90cbdb7bfe41e89cristy maxval=(png_uint_16) ((one << ping_bit_depth)-1); 101663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101674f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_bKGD == MagickFalse) 1016826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 101693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1017016ea139d53d867211d3bb0fa859a83de653f687ecristy ping_background.gray=(png_uint_16) ((maxval/65535.)* 1017111a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy (ScaleQuantumToShort(((GetPixelInfoIntensity(image, 1017216ea139d53d867211d3bb0fa859a83de653f687ecristy &image->background_color))) +.5))); 1017316ea139d53d867211d3bb0fa859a83de653f687ecristy 101743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 101758f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1017616ea139d53d867211d3bb0fa859a83de653f687ecristy " Setting up bKGD chunk (2)"); 1017716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1017816ea139d53d867211d3bb0fa859a83de653f687ecristy " background_color index is %d", 1017916ea139d53d867211d3bb0fa859a83de653f687ecristy (int) ping_background.index); 101803b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 10181991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD = MagickTrue; 1018226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 101833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101843e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 101853e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101863e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " Scaling ping_trans_color.gray from %d", 101873e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (int)ping_trans_color.gray); 101883e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 101899be9b1cfe4c5ead507b2ad633cced4321db3c806glennrp ping_trans_color.gray=(png_uint_16) ((maxval/255.)*( 101903e3e20f27f74686a93873f25b015e0e8e40f451dglennrp ping_trans_color.gray)+.5); 101913e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 101923e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 101933e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101943e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " to %d", (int)ping_trans_color.gray); 101953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1019617a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1019726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 1019826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 101991273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && (int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 1020017a1485544c62993fc7a94e343c87fed5f3e6407glennrp { 1020117a1485544c62993fc7a94e343c87fed5f3e6407glennrp /* 1020217a1485544c62993fc7a94e343c87fed5f3e6407glennrp Identify which colormap entry is the background color. 1020317a1485544c62993fc7a94e343c87fed5f3e6407glennrp */ 1020417a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1020517a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 1020617a1485544c62993fc7a94e343c87fed5f3e6407glennrp 10207a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors,1L); i++) 10208a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (IsPNGColorEqual(image->background_color,image->colormap[i])) 1020917a1485544c62993fc7a94e343c87fed5f3e6407glennrp break; 1021017a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1021117a1485544c62993fc7a94e343c87fed5f3e6407glennrp ping_background.index=(png_byte) i; 1021217a1485544c62993fc7a94e343c87fed5f3e6407glennrp 102133b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up bKGD chunk with index=%d",(int) i); 102170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10218a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 1021913d07043243e0c8c151aad7db5240b75e76ca281cristy if (i < (ssize_t) number_colors) 10220a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp { 102210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 102223b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 102233b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " background =(%d,%d,%d)", 102270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.red, 102280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.green, 102290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.blue); 102300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10231a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp } 1023217a1485544c62993fc7a94e343c87fed5f3e6407glennrp 10233d6bf1617e99df0272b231855a933a74e99b6578fglennrp else /* Can't happen */ 102343c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp { 102353b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102363b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102373b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " No room in PLTE to add bKGD color"); 102383c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp ping_have_bKGD = MagickFalse; 102393c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp } 1024017a1485544c62993fc7a94e343c87fed5f3e6407glennrp } 1024126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1024217a1485544c62993fc7a94e343c87fed5f3e6407glennrp 102433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102451a56e9c9268976936eeab9fe97eb664b847e444cglennrp " PNG color type: %s (%d)", PngColorTypeToString(ping_color_type), 102461a56e9c9268976936eeab9fe97eb664b847e444cglennrp ping_color_type); 102473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 102483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize compression level and filtering. 102493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 102503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102510fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up deflate compression"); 102540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Compression buffer size: 32768"); 102570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 102580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_buffer_size(ping,32768L); 102600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression mem level: 9"); 102640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102654054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_compression_mem_level(ping, 9); 102664054bfbdca478fe065f01d7f8285f7c173ccfcfccristy 1026710d739ef54404090a55cb8977fc51f85cafa81a5glennrp /* Untangle the "-quality" setting: 1026810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1026910d739ef54404090a55cb8977fc51f85cafa81a5glennrp Undefined is 0; the default is used. 1027010d739ef54404090a55cb8977fc51f85cafa81a5glennrp Default is 75 1027110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1027210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10's digit: 1027310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10274ef804f5802b3d6517d516556b64fccc5843710b6glennrp 0 or omitted: Use Z_HUFFMAN_ONLY strategy with the 1027510d739ef54404090a55cb8977fc51f85cafa81a5glennrp zlib default compression level 1027610d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1027710d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1-9: the zlib compression level 1027810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1027910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1's digit: 1028010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1028110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 0-4: the PNG filter method 1028210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1028310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 5: libpng adaptive filtering if compression level > 5 1028410d739ef54404090a55cb8977fc51f85cafa81a5glennrp libpng filter type "none" if compression level <= 5 1028510d739ef54404090a55cb8977fc51f85cafa81a5glennrp or if image is grayscale or palette 10286750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 1028710d739ef54404090a55cb8977fc51f85cafa81a5glennrp 6: libpng adaptive filtering 1028810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1028910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 7: "LOCO" filtering (intrapixel differing) if writing 1029085dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp a MNG, otherwise "none". Did not work in IM-6.7.0-9 1029110d739ef54404090a55cb8977fc51f85cafa81a5glennrp and earlier because of a missing "else". 1029210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029385dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp 8: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), adaptive 1029485dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp filtering. Unused prior to IM-6.7.0-10, was same as 6 1029510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10296ef804f5802b3d6517d516556b64fccc5843710b6glennrp 9: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), no PNG filters 102971868258559ddf946fa73ef72dd43507b32623705glennrp Unused prior to IM-6.7.0-10, was same as 6 1029810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029910d739ef54404090a55cb8977fc51f85cafa81a5glennrp Note that using the -quality option, not all combinations of 1030010d739ef54404090a55cb8977fc51f85cafa81a5glennrp PNG filter type, zlib compression level, and zlib compression 1030116ea139d53d867211d3bb0fa859a83de653f687ecristy strategy are possible. This will be addressed soon in a 1030216ea139d53d867211d3bb0fa859a83de653f687ecristy release that accomodates "-define png:compression-strategy", etc. 1030310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1030410d739ef54404090a55cb8977fc51f85cafa81a5glennrp */ 1030510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1030629dd80efe8d7489d5f689a8a723454e684f92a8fdirk quality=image_info->quality == UndefinedCompressionQuality ? 75UL : 1030729dd80efe8d7489d5f689a8a723454e684f92a8fdirk image_info->quality; 103080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103091868258559ddf946fa73ef72dd43507b32623705glennrp if (quality <= 9) 103101868258559ddf946fa73ef72dd43507b32623705glennrp { 103111868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 103121868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 103131868258559ddf946fa73ef72dd43507b32623705glennrp } 10314750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 103151868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_level == 0) 103163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 103173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 103183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy level; 103193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10320bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy level=(int) MagickMin((ssize_t) quality/10,9); 103210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103221868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = level+1; 103231868258559ddf946fa73ef72dd43507b32623705glennrp } 103240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103251868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 103261868258559ddf946fa73ef72dd43507b32623705glennrp { 103271868258559ddf946fa73ef72dd43507b32623705glennrp if ((quality %10) == 8 || (quality %10) == 9) 10328a24b245fac14ef0617d691de0942697f2eb31b05glennrp#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ 10329a24b245fac14ef0617d691de0942697f2eb31b05glennrp mng_info->write_png_compression_strategy=Z_RLE+1; 10330a24b245fac14ef0617d691de0942697f2eb31b05glennrp#else 10331a24b245fac14ef0617d691de0942697f2eb31b05glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 10332a24b245fac14ef0617d691de0942697f2eb31b05glennrp#endif 103333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103351868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 0) 103361868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter=((int) quality % 10) + 1; 103371868258559ddf946fa73ef72dd43507b32623705glennrp 103381868258559ddf946fa73ef72dd43507b32623705glennrp if (logging != MagickFalse) 103393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 103401868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level) 103413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103421868258559ddf946fa73ef72dd43507b32623705glennrp " Compression level: %d", 103431868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_level-1); 103440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103451868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy) 103461868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103471868258559ddf946fa73ef72dd43507b32623705glennrp " Compression strategy: %d", 103481868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_strategy-1); 103490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103501868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103511868258559ddf946fa73ef72dd43507b32623705glennrp " Setting up filtering"); 103523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 103534054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png_compression_filter == 6) 1035410d739ef54404090a55cb8977fc51f85cafa81a5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103551868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: ADAPTIVE"); 103564054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 0 || 103574054bfbdca478fe065f01d7f8285f7c173ccfcfccristy mng_info->write_png_compression_filter == 1) 103581868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103591868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: NONE"); 103601868258559ddf946fa73ef72dd43507b32623705glennrp else 103611868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103621868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: %d", 103631868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_filter-1); 103643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103661868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level != 0) 103671868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_level(ping,mng_info->write_png_compression_level-1); 103680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103691868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 6) 103701868258559ddf946fa73ef72dd43507b32623705glennrp { 103711868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 103721868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 103731868258559ddf946fa73ef72dd43507b32623705glennrp (quality < 50)) 103741868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 103751868258559ddf946fa73ef72dd43507b32623705glennrp else 103761868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 103771868258559ddf946fa73ef72dd43507b32623705glennrp } 103784054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 7 || 103791868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter == 10) 103801868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 1038110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 103821868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 8) 103831868258559ddf946fa73ef72dd43507b32623705glennrp { 103841868258559ddf946fa73ef72dd43507b32623705glennrp#if defined(PNG_MNG_FEATURES_SUPPORTED) && defined(PNG_INTRAPIXEL_DIFFERENCING) 103851868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_mng) 103861868258559ddf946fa73ef72dd43507b32623705glennrp { 103871868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_RGB) || 103881868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_RGBA)) 103891868258559ddf946fa73ef72dd43507b32623705glennrp ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING; 103901868258559ddf946fa73ef72dd43507b32623705glennrp } 103911868258559ddf946fa73ef72dd43507b32623705glennrp#endif 103924054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 103931868258559ddf946fa73ef72dd43507b32623705glennrp } 103940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103951868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 9) 103961868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 103970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103981868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter != 0) 103991868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE, 104001868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter-1); 104010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104021868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy != 0) 104031868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_strategy(ping, 104041868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy-1); 104052b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 10406dec72c9b492c176af9813be3105518e91835ed37glennrp ping_interlace_method=image_info->interlace != NoInterlace; 10407dec72c9b492c176af9813be3105518e91835ed37glennrp 10408dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_mng) 10409dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_sig_bytes(ping,8); 10410dec72c9b492c176af9813be3105518e91835ed37glennrp 10411dec72c9b492c176af9813be3105518e91835ed37glennrp /* Bail out if cannot meet defined png:bit-depth or png:color-type */ 10412dec72c9b492c176af9813be3105518e91835ed37glennrp 10413dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype != 0) 10414dec72c9b492c176af9813be3105518e91835ed37glennrp { 10415dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY) 10416dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_have_color != MagickFalse) 10417dec72c9b492c176af9813be3105518e91835ed37glennrp { 10418dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type = PNG_COLOR_TYPE_RGB; 10419dec72c9b492c176af9813be3105518e91835ed37glennrp 10420dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_bit_depth < 8) 10421dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth=8; 10422dec72c9b492c176af9813be3105518e91835ed37glennrp } 10423dec72c9b492c176af9813be3105518e91835ed37glennrp 10424dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY_ALPHA) 10425dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_have_color != MagickFalse) 10426dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type = PNG_COLOR_TYPE_RGB_ALPHA; 10427dec72c9b492c176af9813be3105518e91835ed37glennrp } 10428dec72c9b492c176af9813be3105518e91835ed37glennrp 10429dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_need_colortype_warning != MagickFalse || 10430dec72c9b492c176af9813be3105518e91835ed37glennrp ((mng_info->write_png_depth && 10431dec72c9b492c176af9813be3105518e91835ed37glennrp (int) mng_info->write_png_depth != ping_bit_depth) || 10432dec72c9b492c176af9813be3105518e91835ed37glennrp (mng_info->write_png_colortype && 10433dec72c9b492c176af9813be3105518e91835ed37glennrp ((int) mng_info->write_png_colortype-1 != ping_color_type && 10434dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_colortype != 7 && 10435dec72c9b492c176af9813be3105518e91835ed37glennrp !(mng_info->write_png_colortype == 5 && ping_color_type == 0))))) 10436dec72c9b492c176af9813be3105518e91835ed37glennrp { 10437dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10438dec72c9b492c176af9813be3105518e91835ed37glennrp { 10439dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_need_colortype_warning != MagickFalse) 10440dec72c9b492c176af9813be3105518e91835ed37glennrp { 10441dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10442dec72c9b492c176af9813be3105518e91835ed37glennrp " Image has transparency but tRNS chunk was excluded"); 10443dec72c9b492c176af9813be3105518e91835ed37glennrp } 10444dec72c9b492c176af9813be3105518e91835ed37glennrp 10445dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_depth) 10446dec72c9b492c176af9813be3105518e91835ed37glennrp { 10447dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10448dec72c9b492c176af9813be3105518e91835ed37glennrp " Defined png:bit-depth=%u, Computed depth=%u", 10449dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_depth, 10450dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth); 10451dec72c9b492c176af9813be3105518e91835ed37glennrp } 10452dec72c9b492c176af9813be3105518e91835ed37glennrp 10453dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype) 10454dec72c9b492c176af9813be3105518e91835ed37glennrp { 10455dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10456dec72c9b492c176af9813be3105518e91835ed37glennrp " Defined png:color-type=%u, Computed color type=%u", 10457dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_colortype-1, 10458dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type); 10459dec72c9b492c176af9813be3105518e91835ed37glennrp } 10460dec72c9b492c176af9813be3105518e91835ed37glennrp } 10461dec72c9b492c176af9813be3105518e91835ed37glennrp 10462dec72c9b492c176af9813be3105518e91835ed37glennrp png_warning(ping, 10463dec72c9b492c176af9813be3105518e91835ed37glennrp "Cannot write image with defined png:bit-depth or png:color-type."); 10464dec72c9b492c176af9813be3105518e91835ed37glennrp } 10465dec72c9b492c176af9813be3105518e91835ed37glennrp 1046617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image_matte != MagickFalse && image->alpha_trait == UndefinedPixelTrait) 10467dec72c9b492c176af9813be3105518e91835ed37glennrp { 10468dec72c9b492c176af9813be3105518e91835ed37glennrp /* Add an opaque matte channel */ 10469dec72c9b492c176af9813be3105518e91835ed37glennrp image->alpha_trait = BlendPixelTrait; 10470dec72c9b492c176af9813be3105518e91835ed37glennrp (void) SetImageAlpha(image,OpaqueAlpha,exception); 10471dec72c9b492c176af9813be3105518e91835ed37glennrp 10472dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10473dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10474dec72c9b492c176af9813be3105518e91835ed37glennrp " Added an opaque matte channel"); 10475dec72c9b492c176af9813be3105518e91835ed37glennrp } 10476dec72c9b492c176af9813be3105518e91835ed37glennrp 10477dec72c9b492c176af9813be3105518e91835ed37glennrp if (number_transparent != 0 || number_semitransparent != 0) 10478dec72c9b492c176af9813be3105518e91835ed37glennrp { 10479dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_color_type < 4) 10480dec72c9b492c176af9813be3105518e91835ed37glennrp { 10481dec72c9b492c176af9813be3105518e91835ed37glennrp ping_have_tRNS=MagickTrue; 10482dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10483dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10484dec72c9b492c176af9813be3105518e91835ed37glennrp " Setting ping_have_tRNS=MagickTrue."); 10485dec72c9b492c176af9813be3105518e91835ed37glennrp } 10486dec72c9b492c176af9813be3105518e91835ed37glennrp } 10487dec72c9b492c176af9813be3105518e91835ed37glennrp 10488dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10489dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10490dec72c9b492c176af9813be3105518e91835ed37glennrp " Writing PNG header chunks"); 10491dec72c9b492c176af9813be3105518e91835ed37glennrp 10492dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_IHDR(ping,ping_info,ping_width,ping_height, 10493dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth,ping_color_type, 10494dec72c9b492c176af9813be3105518e91835ed37glennrp ping_interlace_method,ping_compression_method, 10495dec72c9b492c176af9813be3105518e91835ed37glennrp ping_filter_method); 10496dec72c9b492c176af9813be3105518e91835ed37glennrp 10497dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_color_type == 3 && ping_have_PLTE != MagickFalse) 10498dec72c9b492c176af9813be3105518e91835ed37glennrp { 10499dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_PLTE(ping,ping_info,palette,number_colors); 10500dec72c9b492c176af9813be3105518e91835ed37glennrp 10501dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10502dec72c9b492c176af9813be3105518e91835ed37glennrp { 10503dec72c9b492c176af9813be3105518e91835ed37glennrp for (i=0; i< (ssize_t) number_colors; i++) 10504dec72c9b492c176af9813be3105518e91835ed37glennrp { 10505dec72c9b492c176af9813be3105518e91835ed37glennrp if (i < ping_num_trans) 10506dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10507dec72c9b492c176af9813be3105518e91835ed37glennrp " PLTE[%d] = (%d,%d,%d), tRNS[%d] = (%d)", 10508dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10509dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].red, 10510dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].green, 10511dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].blue, 10512dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10513dec72c9b492c176af9813be3105518e91835ed37glennrp (int) ping_trans_alpha[i]); 10514dec72c9b492c176af9813be3105518e91835ed37glennrp else 10515dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10516dec72c9b492c176af9813be3105518e91835ed37glennrp " PLTE[%d] = (%d,%d,%d)", 10517dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10518dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].red, 10519dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].green, 10520dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].blue); 10521dec72c9b492c176af9813be3105518e91835ed37glennrp } 10522dec72c9b492c176af9813be3105518e91835ed37glennrp } 10523dec72c9b492c176af9813be3105518e91835ed37glennrp } 10524dec72c9b492c176af9813be3105518e91835ed37glennrp 105250d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Only write the iCCP chunk if we are not writing the sRGB chunk. */ 105260d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (ping_exclude_sRGB != MagickFalse || 105273d627862fb79aad8a20be4f1587f0b8761db441aglennrp (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 105280d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 105290d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((ping_exclude_tEXt == MagickFalse || 105300d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ping_exclude_zTXt == MagickFalse) && 105310d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse)) 10532c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10533c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ResetImageProfileIterator(image); 10534c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 105353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10536c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp profile=GetImageProfile(image,name); 105370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10538c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (profile != (StringInfo *) NULL) 10539c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10540c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp#ifdef PNG_WRITE_iCCP_SUPPORTED 10541c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if ((LocaleCompare(name,"ICC") == 0) || 10542c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (LocaleCompare(name,"ICM") == 0)) 1054326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 10544c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 10545c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_iCCP == MagickFalse) 10546c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10547ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10548ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Setting up iCCP chunk"); 105496647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 1055016ea139d53d867211d3bb0fa859a83de653f687ecristy png_set_iCCP(ping,ping_info,(png_charp) name,0, 10551e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 10552c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_charp) GetStringInfoDatum(profile), 10553e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#else 10554120b581ad9516a43c50caedfa1a8cff418488819Cristy (const png_byte *) GetStringInfoDatum(profile), 10555e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#endif 10556c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10557918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP = MagickTrue; 10558c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 1055926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 105600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10561c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 105623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 10563c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_zCCP == MagickFalse) 10564c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10565ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10566ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Setting up zTXT chunk with uuencoded ICC"); 10567cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_png_write_raw_profile(image_info,ping,ping_info, 10568c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (unsigned char *) name,(unsigned char *) name, 10569c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp GetStringInfoDatum(profile), 10570c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10571ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_iCCP = MagickTrue; 10572c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10573c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 105740b206f5daa453dc1035db5890cabc899736dc2d0glennrp 10575c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10576c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10577c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Setting up text chunk with %s profile",name); 105780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10579c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp name=GetNextImageProfile(image); 10580c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 105810d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 105823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 105833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 105843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_sRGB_SUPPORTED) 105853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_srgb == 0) && 10586ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_iCCP != MagickTrue && 10587ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (ping_have_sRGB != MagickFalse || 10588ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 105893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1059026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_sRGB == MagickFalse) 1059126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1059226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1059326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image rendering intent. 1059426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1059526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1059626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1059726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up sRGB chunk"); 105980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1059926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) png_set_sRGB(ping,ping_info,( 10600cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 10601cf002022280cc4dedb2748ad6f415aac1d44f530glennrp image->rendering_intent))); 10602918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp 10603918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB = MagickTrue; 1060426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1060626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 106075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((!mng_info->write_mng) || (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 106083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 106093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106102cc891a179d622dde7bbb8854138851e828bc6eaglennrp if (ping_exclude_gAMA == MagickFalse && 10611918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP == MagickFalse && 10612918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB == MagickFalse && 106132cc891a179d622dde7bbb8854138851e828bc6eaglennrp (ping_exclude_sRGB == MagickFalse || 1061426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->gamma < .45 || image->gamma > .46))) 1061526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 106163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_gama == 0) && (image->gamma != 0.0)) 106173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 106193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image gamma. 106203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 106213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 106223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 106233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up gAMA chunk"); 106253b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 106263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_gAMA(ping,ping_info,image->gamma); 106273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1062826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106292b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 10630918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp if (ping_exclude_cHRM == MagickFalse && ping_have_sRGB == MagickFalse) 106313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1063226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if ((mng_info->have_write_global_chrm == 0) && 1063326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->chromaticity.red_primary.x != 0.0)) 1063426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1063526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1063626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image chromaticity. 10637918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp Note: if cHRM+gAMA == sRGB write sRGB instead. 1063826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1063926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PrimaryInfo 1064026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp, 1064126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp, 1064226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp, 1064326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp; 1064426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1064526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp=image->chromaticity.white_point; 1064626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp=image->chromaticity.red_primary; 1064726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp=image->chromaticity.green_primary; 1064826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp=image->chromaticity.blue_primary; 1064926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1065026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1065126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1065226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up cHRM chunk"); 1065326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1065426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_cHRM(ping,ping_info,wp.x,wp.y,rp.x,rp.y,gp.x,gp.y, 1065526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp.x,bp.y); 1065626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1065726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10659dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 1066026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 1066126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1066226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_bKGD != MagickFalse) 10663c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 1066426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_bKGD(ping,ping_info,&ping_background); 106658fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 10666c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 10667c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10668c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Setting up bKGD chunk"); 10669c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10670c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background color = (%d,%d,%d)", 10671c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.red, 10672c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.green, 10673c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.blue); 10674c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10675c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " index = %d, gray=%d", 10676c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index, 10677c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.gray); 10678c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 10679c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 1068026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10681991d11dd9c33e65872778b81aff1347cd2878154glennrp 1068226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 10683dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1068426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_pHYs != MagickFalse) 1068526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1068626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_pHYs(ping,ping_info, 1068726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_x_resolution, 1068826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_y_resolution, 1068926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_unit_type); 10690823b55c200d7fc1818ab539b036a9c24feaecda8glennrp 106918fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 10692823b55c200d7fc1818ab539b036a9c24feaecda8glennrp { 10693823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10694823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Setting up pHYs chunk"); 10695823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10696823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " x_resolution=%lu", 10697823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_x_resolution); 10698823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10699823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " y_resolution=%lu", 10700823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_y_resolution); 10701823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10702823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " unit_type=%lu", 10703823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_unit_type); 10704823b55c200d7fc1818ab539b036a9c24feaecda8glennrp } 1070526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10706dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10707dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10708dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#if defined(PNG_oFFs_SUPPORTED) 107094f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_oFFs == MagickFalse) 10710dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1071126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (image->page.x || image->page.y) 1071226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1071326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_oFFs(ping,ping_info,(png_int_32) image->page.x, 1071426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (png_int_32) image->page.y, 0); 10715dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 1071626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1071726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1071826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up oFFs chunk with x=%d, y=%d, units=0", 1071926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (int) image->page.x, (int) image->page.y); 1072026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10721dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10722dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#endif 10723dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10724fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 10725fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (ping_exclude_tIME == MagickFalse) 10726fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 10727fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk const char 10728fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk *timestamp; 10729fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 1073039d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (image->taint == MagickFalse) 10731fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 1073239d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp timestamp=GetImageOption(image_info,"png:tIME"); 1073339d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1073439d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (timestamp == (const char *) NULL) 10735fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk timestamp=GetImageProperty(image,"png:tIME",exception); 10736fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 1073739d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1073839d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp else 1073939d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp { 1074039d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1074139d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp " Reset tIME in tainted image"); 1074239d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1074339d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp timestamp=GetImageProperty(image,"date:modify",exception); 1074439d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp } 1074539d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1074639d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (timestamp != (const char *) NULL) 1074739d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp write_tIME_chunk(image,ping,ping_info,timestamp,exception); 10748fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 10749fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 107506647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 10751da8f3a7bfddac2680a3069a490db541e7944edafglennrp if (mng_info->need_blob != MagickFalse) 10752da8f3a7bfddac2680a3069a490db541e7944edafglennrp { 1075316ea139d53d867211d3bb0fa859a83de653f687ecristy if (OpenBlob(image_info,image,WriteBinaryBlobMode,exception) == 10754da8f3a7bfddac2680a3069a490db541e7944edafglennrp MagickFalse) 10755da8f3a7bfddac2680a3069a490db541e7944edafglennrp png_error(ping,"WriteBlob Failed"); 10756da8f3a7bfddac2680a3069a490db541e7944edafglennrp 10757da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickTrue; 10758da8f3a7bfddac2680a3069a490db541e7944edafglennrp } 10759da8f3a7bfddac2680a3069a490db541e7944edafglennrp 107603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info_before_PLTE(ping, ping_info); 10761991d11dd9c33e65872778b81aff1347cd2878154glennrp 1076239992b4dd9b12ef752d55b8e402c069698851f72glennrp if (ping_have_tRNS != MagickFalse && ping_color_type < 4) 10763991d11dd9c33e65872778b81aff1347cd2878154glennrp { 107643b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 107650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 107670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Calling png_set_tRNS with num_trans=%d",ping_num_trans); 107680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10769991d11dd9c33e65872778b81aff1347cd2878154glennrp 107700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == 3) 107710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 107720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_trans_alpha, 107730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_num_trans, 107740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL); 10775991d11dd9c33e65872778b81aff1347cd2878154glennrp 107760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 107770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 107790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL, 107800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 0, 107810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp &ping_trans_color); 107820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 107833b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 107840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10786c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " tRNS color =(%d,%d,%d)", 107870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.red, 107880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.green, 107890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.blue); 107900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 107910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 107920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10793991d11dd9c33e65872778b81aff1347cd2878154glennrp 107943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any png-chunk-b profiles */ 10795cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-b",logging); 10796da8f3a7bfddac2680a3069a490db541e7944edafglennrp 107973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info(ping,ping_info); 10798991d11dd9c33e65872778b81aff1347cd2878154glennrp 107993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-m profiles */ 10800cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-m",logging); 108013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1080226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_vpAg == MagickFalse) 108033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 108044f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 108054f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (image->page.height != 0 && image->page.height != image->rows)) 1080626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1080726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp unsigned char 1080826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[14]; 1080926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1081026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 1081126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGType(chunk,mng_vpAg); 1081203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 1081326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+4,(png_uint_32) image->page.width); 1081426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+8,(png_uint_32) image->page.height); 1081526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[12]=0; /* unit = pixels */ 1081626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlob(image,13,chunk); 1081726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 1081826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 108193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 108213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (PNG_LIBPNG_VER == 10206) 108229c1eb0729653219b9da9037e044501a6dce79d10glennrp /* avoid libpng-1.2.6 bug by setting PNG_HAVE_IDAT flag */ 108233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_HAVE_IDAT 0x04 108249c1eb0729653219b9da9037e044501a6dce79d10glennrp ping->mode |= PNG_HAVE_IDAT; 108253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef PNG_HAVE_IDAT 108263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 108273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 108283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_packing(ping); 108293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate memory. 108313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 108323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes=image->columns; 10833b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (image_depth > 8) 10834b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 108357202c101b42be63076be56386f79429bb2f39784cristy switch (ping_color_type) 108363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10837b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGB: 108383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=3; 10839b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10841b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 10842b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 10843b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10845b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGBA: 108463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=4; 10847b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10849b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp default: 10850b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108523b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 108533b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 108543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10855b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10856b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing PNG image data"); 108570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10858b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10859e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Allocating %.20g bytes of memory for pixels",(double) rowbytes); 108603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108610997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(rowbytes,sizeof(*ping_pixels)); 108620997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info == (MemoryInfo *) NULL) 10863edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Allocation of memory for pixels failed"); 108640997332e2c35a821b271d6e7473c01c10dc206adcristy ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); 108650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 108663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image scanlines. 108683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 108695f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 10870ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy if (quantum_info == (QuantumInfo *) NULL) 10871edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation for quantum_info failed"); 108723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->format=UndefinedQuantumFormat; 108733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=image_depth; 108744b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp (void) SetQuantumEndian(image,quantum_info,MSBEndian); 108753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 108768bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 108773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!mng_info->write_png8 && !mng_info->write_png24 && 10878fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png48 && !mng_info->write_png64 && 108798bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp !mng_info->write_png32) && 108808bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (mng_info->IsPalette || 108813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->type == BilevelType)) && 108828d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp image_matte == MagickFalse && 108838d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw == MagickFalse) 108843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 108858bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp /* Palette, Bilevel, or Opaque Monochrome */ 1088616ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 108873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 108880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 108893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->depth=8; 108903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 108913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 108923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a PNG monochrome image. 108943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10895bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 108963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10897d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse && y == 0) 108983b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 108993b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Writing row of pixels (0)"); 10900a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 1090116ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 109020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1090316ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 109043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 109050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 109073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1090816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1090916ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 109103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE && 109113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth && 109123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth != old_bit_depth) 109133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Undo pixel scaling */ 10915bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10916cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) (*(ping_pixels+i) 109173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy >> (8-old_bit_depth)); 109183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 109223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1092316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1092416ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 109253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE) 10928bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10929cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) ((*(ping_pixels+i) > 127) ? 109303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 255 : 0); 109310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109323b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10933b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10934b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (1)"); 109350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10936cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 10937af9320404a7b05014476f844b11110157a21b73eglennrp 10938af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 10939af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 10940af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1094144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 10942af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 10943af9320404a7b05014476f844b11110157a21b73eglennrp break; 109443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109488bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* Not Palette, Bilevel, or Opaque Monochrome */ 109493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((!mng_info->write_png8 && !mng_info->write_png24 && 10951fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png48 && !mng_info->write_png64 && 10952fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png32) && (image_matte != MagickFalse || 10953fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (ping_bit_depth >= MAGICKCORE_QUANTUM_DEPTH)) && 10954fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (mng_info->IsPalette) && ping_have_color == MagickFalse) 109553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1095616ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 109578bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 109580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109598bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 109603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109618bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 10962bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 109633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1096416ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 109652cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1096616ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 109673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 109682cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109695af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 109703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109718bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->IsPalette) 1097216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1097316ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 109742cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 1097616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1097716ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 109782cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109798bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 109808bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 109818bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY PNG pixels (2)"); 109823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109832cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109848bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* PNG_COLOR_TYPE_GRAY_ALPHA */ 10985b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 109863b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10987b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 109888bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (2)"); 109892cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1099016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1099116ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayAlphaQuantum,ping_pixels,exception); 10992b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 109932cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109943b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10995b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 109968bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (2)"); 109972cc891a179d622dde7bbb8854138851e828bc6eaglennrp 10998cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 109992cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11000af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 11001af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11002af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1100344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 11004af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 11005af9320404a7b05014476f844b11110157a21b73eglennrp break; 110068bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110088bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 110113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1101216ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 110138bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 110140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110158bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 110163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11017fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if ((image_depth > 8) || 11018fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 || 110198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp mng_info->write_png32 || 11020fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || 11021fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 || 11022fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (!mng_info->write_png8 && !mng_info->IsPalette)) 110238bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110248bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 11025b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 11026862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 110272cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1102816ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 110298bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 110302cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110318bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 110328bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110338bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (image->storage_class == DirectClass) 1103416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1103516ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 110362cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110378bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1103816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1103916ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 110408bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110412cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110428bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 110438bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1104416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 11045cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1104616ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 110472cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110488bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 110498bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110508bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (3)"); 110518bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110522cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110538bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (image_matte != MagickFalse) 1105416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1105516ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBAQuantum,ping_pixels,exception); 110562cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110578bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1105816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1105916ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBQuantum,ping_pixels,exception); 110602cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110613b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 11062b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110638bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (3)"); 110642cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11065cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 11066af9320404a7b05014476f844b11110157a21b73eglennrp 11067af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 11068af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11069af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1107044c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 11071af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 11072af9320404a7b05014476f844b11110157a21b73eglennrp break; 11073b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 110748bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110752cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110768bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 11077fd164d2bf84b111e304959af5698757d60e9b8aeglennrp /* not ((image_depth > 8) || 11078fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 || mng_info->write_png32 || 11079fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || mng_info->write_png64 || 11080fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (!mng_info->write_png8 && !mng_info->IsPalette)) 11081fd164d2bf84b111e304959af5698757d60e9b8aeglennrp */ 110828bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110838bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if ((ping_color_type != PNG_COLOR_TYPE_GRAY) && 110848bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (ping_color_type != PNG_COLOR_TYPE_GRAY_ALPHA)) 110858bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110868bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse) 110878bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110888bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is not GRAY or GRAY_ALPHA",pass); 110892cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110908bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp quantum_info->depth=8; 110918bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=8; 110928bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110932cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110948bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 110958640fb5e9b1094f35f8beab436f81661b8a99448glennrp { 110968bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 110978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); 110992cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1110016ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 111012cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1110216ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 111038bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 111042cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111058bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 1110644757ab033a4bc1f272fb26c9a46325ca01a5482glennrp { 111074bf89731a90c6e03598950223e19e7be7b95d630glennrp quantum_info->depth=image->depth; 111084bf89731a90c6e03598950223e19e7be7b95d630glennrp 1110916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1111016ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 1111144757ab033a4bc1f272fb26c9a46325ca01a5482glennrp } 111122cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111138bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 111148bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 111158bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 111168bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111178bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (4)"); 111182cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1111916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 11120cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1112116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 111228bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 111232cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111248bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 111258bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1112616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1112716ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,IndexQuantum,ping_pixels,exception); 111282cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111295eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp if (logging != MagickFalse && y <= 2) 111305eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp { 111315eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111321a7d6dbd296698a7cddbc625896987bf674c0cc4glennrp " Writing row of non-gray pixels (4)"); 111335eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp 111345eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111355eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp " ping_pixels[0]=%d,ping_pixels[1]=%d", 111365eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (int)ping_pixels[0],(int)ping_pixels[1]); 111375eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp } 111388bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 11139cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 111402cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11141af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 11142af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11143af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1114444c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 111458bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (status == MagickFalse) 111468bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 111478640fb5e9b1094f35f8beab436f81661b8a99448glennrp } 11148af9320404a7b05014476f844b11110157a21b73eglennrp } 111493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111518bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 111528bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 11153b32b90a7e1ee2275333589072c496b5f69e17feccristy if (quantum_info != (QuantumInfo *) NULL) 11154b32b90a7e1ee2275333589072c496b5f69e17feccristy quantum_info=DestroyQuantumInfo(quantum_info); 111553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 111563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 111573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11159b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Wrote PNG image data"); 111600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11162e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Width: %.20g",(double) ping_width); 111630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11165e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Height: %.20g",(double) ping_height); 111660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 111683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111705d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:bit-depth: %d",mng_info->write_png_depth); 111713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG bit-depth written: %d",ping_bit_depth); 111750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 111773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111795d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:color-type: %d",mng_info->write_png_colortype-1); 111803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG color-type written: %d",ping_color_type); 111840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG Interlace method: %d",ping_interlace_method); 111873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11189a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp Generate text chunks after IDAT. 111903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11191823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse) 111923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1119326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ResetImagePropertyIterator(image); 1119426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1119526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp while (property != (const char *) NULL) 1119626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1119726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_textp 1119826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp text; 111992cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1120016ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(image,property,exception); 11201a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11202e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp /* Don't write any "png:" or "jpeg:" properties; those are just for 11203e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp * "identify" or for passing through to another JPEG 11204e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp */ 11205e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp if ((LocaleNCompare(property,"png:",4) != 0 && 11206a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp LocaleNCompare(property,"jpeg:",5) != 0) && 11207e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp 11208a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11209a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress density and units if we wrote a pHYs chunk */ 11210a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_pHYs != MagickFalse || 11211823b55c200d7fc1818ab539b036a9c24feaecda8glennrp LocaleCompare(property,"density") != 0 || 11212a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleCompare(property,"units") != 0) && 11213a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11214a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress the IM-generated Date:create and Date:modify */ 11215a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_date == MagickFalse || 11216a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleNCompare(property, "Date:",5) != 0)) 1121726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 11218c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (value != (const char *) NULL) 11219c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 11220a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy 11221ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 11222a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping, 11223a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy (png_alloc_size_t) sizeof(png_text)); 11224a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 11225a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); 11226a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 11227c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].key=(char *) property; 11228c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text=(char *) value; 11229c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length=strlen(value); 112302cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11231c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (ping_exclude_tEXt != MagickFalse) 11232c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_zTXt; 112332cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11234c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else if (ping_exclude_zTXt != MagickFalse) 11235c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_NONE; 112362cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11237c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else 1123826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 11239c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=image_info->compression == NoCompression || 11240c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (image_info->compression == UndefinedCompression && 11241c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length < 128) ? PNG_TEXT_COMPRESSION_NONE : 11242c70af4ac292f8db9a1ab488318912894d412cb8cglennrp PNG_TEXT_COMPRESSION_zTXt ; 1124326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 112442cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11245c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (logging != MagickFalse) 11246c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 11247c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11248c70af4ac292f8db9a1ab488318912894d412cb8cglennrp " Setting up text chunk"); 11249c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 11250c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11251cbc9215c23fce410bf0bea825dee908c15271bb3glennrp " keyword: '%s'",text[0].key); 11252c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 11253c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 11254c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_set_text(ping,ping_info,text,1); 11255c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_free(ping,text); 11256c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 1125726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1125826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1125926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 112603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 112613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-e profiles */ 11263cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-e",logging); 112643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 112663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 112673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG end info"); 112680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 112693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_end(ping,ping_info); 112700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 112713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && (int) image->dispose == BackgroundDispose) 112723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 112733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.x || mng_info->page.y || 112745af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_width != mng_info->page.width) || 112755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_height != mng_info->page.height)) 112763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 112773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 112783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[32]; 112793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 112813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write FRAM 4 with clipping boundaries followed by FRAM 1. 112823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 112833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,27L); /* data length=27 */ 112843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1128503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,27L); 112863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=4; 112873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 112883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=1; /* flag for changing delay, for next frame only */ 112893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 112903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=1; /* flag for changing frame clipping for next frame */ 112913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 112923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) (0L)); /* temporary 0 delay */ 112933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=0; /* clipping boundaries delta type */ 112943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */ 112953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+19, 112965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.x + ping_width)); 112973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */ 112983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+27, 112995af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.y + ping_height)); 113003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,31,chunk); 113013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,31)); 113023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=4; 113033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 113043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 113050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 113063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 113073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 113083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 113093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng && !mng_info->need_fram && 113103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((int) image->dispose == 3)) 11311edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cannot convert GIF with disposal method 3 to MNG-LC"); 113120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 113133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 113143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free PNG resources. 113153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 113165af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 113173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 113183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 113190997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 113203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1132116ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 1132216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 1132316ea139d53d867211d3bb0fa859a83de653f687ecristy 1132416ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 1132516ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 1132616ea139d53d867211d3bb0fa859a83de653f687ecristy 11327b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp /* Store bit depth actually written */ 11328b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[0]=(char) ping_bit_depth; 11329b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[1]='\0'; 11330b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 1133116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(IMimage,"png:bit-depth-written",s,exception); 11332b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 113333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 113343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 113353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOnePNGImage()"); 113360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11337868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 11338edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 11339edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 11340edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 11341edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block. Revert to 11342edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 11343edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 11344edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 113453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 113463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* End write one PNG image */ 11347edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 113483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 113493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 113503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 113513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e P N G I m a g e % 113563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WritePNGImage() writes a Portable Network Graphics (PNG) or 113623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file. 113633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 113653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WritePNGImage method is: 113673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1136816ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1136916ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 113703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 113723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 113743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 113763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1137716ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1137816ea139d53d867211d3bb0fa859a83de653f687ecristy% 113793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Returns MagickTrue on success, MagickFalse on failure. 113803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Communicating with the PNG encoder: 113823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% While the datastream written is always in PNG format and normally would 113843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be given the "png" file extension, this method also writes the following 113855d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% pseudo-formats which are subsets of png: 113863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113875a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% o PNG8: An 8-bit indexed PNG datastream is written. If the image has 113885a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% a depth greater than 8, the depth is reduced. If transparency 113893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is present, the tRNS chunk must only have values 0 and 255 113903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (i.e., transparency is binary: fully opaque or fully 113915a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent). If other values are present they will be 113925a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 50%-thresholded to binary transparency. If more than 256 11393e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% colors are present, they will be quantized to the 4-4-4-1, 11394130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% 3-3-3-1, or 3-3-2-1 palette. The underlying RGB color 11395130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% of any resulting fully-transparent pixels is changed to 11396130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% the image's background color. 11397e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% 11398e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% If you want better quantization or dithering of the colors 11399e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% or alpha than that, you need to do it before calling the 114005a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG encoder. The pixels contain 8-bit indices even if 114015a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% they could be represented with 1, 2, or 4 bits. Grayscale 114023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% images will be written as indexed PNG files even though the 114035a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG grayscale type might be slightly more efficient. Please 114045a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% note that writing to the PNG8 format may result in loss 114055a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% of color and alpha data. 114063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG24: An 8-bit per sample RGB PNG datastream is written. The tRNS 114083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk can be present to convey binary transparency by naming 114095a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% one of the colors as transparent. The only loss incurred 114105a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% is reduction of sample depth to 8. If the image has more 114115a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% than one transparent color, has semitransparent pixels, or 114125a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% has an opaque pixel with the same RGB components as the 114135a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent color, an image is not written. 114143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG32: An 8-bit per sample RGBA PNG is written. Partial 114163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparency is permitted, i.e., the alpha sample for 114173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% each pixel can have any value from 0 to 255. The alpha 114180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% channel is present even if the image is fully opaque. 114195a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% The only loss in data is the reduction of the sample depth 114205a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% to 8. 114213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11422fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% o PNG48: A 16-bit per sample RGB PNG datastream is written. The tRNS 11423fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% chunk can be present to convey binary transparency by naming 11424fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% one of the colors as transparent. If the image has more 11425fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% than one transparent color, has semitransparent pixels, or 11426fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% has an opaque pixel with the same RGB components as the 11427fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% transparent color, an image is not written. 11428fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% 11429fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% o PNG64: A 16-bit per sample RGBA PNG is written. Partial 11430fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% transparency is permitted, i.e., the alpha sample for 11431fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% each pixel can have any value from 0 to 65535. The alpha 11432fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% channel is present even if the image is fully opaque. 11433fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% 114345830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% o PNG00: A PNG that inherits its colortype and bit-depth from the input 114355830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% image, if the input was a PNG, is written. If these values 11436c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% cannot be found, or if the pixels have been changed in a way 11437c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% that makes this impossible, then "PNG00" falls back to the 11438c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% regular "PNG" format. 114395830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% 114403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o -define: For more precise control of the PNG output, you can use the 114413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image options "png:bit-depth" and "png:color-type". These 114423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% can be set from the commandline with "-define" and also 11443bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% from the application programming interfaces. The options 11444bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% are case-independent and are converted to lowercase before 11445bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% being passed to this encoder. 114463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:color-type can be 0, 2, 3, 4, or 6. 114483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 0 (Grayscale), png:bit-depth can 114503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, 8, or 16. 114513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 2 (RGB), png:bit-depth can 114533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 8 or 16. 114543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 3 (Indexed), png:bit-depth can 114563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, or 8. This refers to the number of bits 114573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% used to store the index. The color samples always have 114583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% bit-depth 8 in indexed PNG files. 114593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 4 (Gray-Matte) or 6 (RGB-Matte), 114613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:bit-depth can be 8 or 16. 114623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11463fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% If the image cannot be written without loss with the 11464fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% requested bit-depth and color-type, a PNG file will not 11465fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% be written, a warning will be issued, and the encoder will 11466fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% return MagickFalse. 114675a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 114683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Since image encoders should not be responsible for the "heavy lifting", 114693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the user should make sure that ImageMagick has already reduced the 114703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image depth and number of colors and limit transparency to binary 114715a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparency prior to attempting to write the image with depth, color, 1147216ea139d53d867211d3bb0fa859a83de653f687ecristy% or transparency limitations. 114733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Note that another definition, "png:bit-depth-written" exists, but it 114753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is not intended for external use. It is only used internally by the 114763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG encoder to inform the JNG encoder of the depth of the alpha channel. 114773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It is possible to request that the PNG encoder write previously-formatted 114793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary chunks in the output PNG file, using the "-profile" commandline 114803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% option as shown below or by setting the profile via a programming 114813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% interface: 114823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% -profile PNG-chunk-x:<file> 114843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% where x is a location flag and <file> is a file containing the chunk 114863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% name in the first 4 bytes, then a colon (":"), followed by the chunk data. 11487bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% This encoder will compute the chunk length and CRC, so those must not 11488bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% be included in the file. 114893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "x" can be "b" (before PLTE), "m" (middle, i.e., between PLTE and IDAT), 114913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% or "e" (end, i.e., after IDAT). If you want to write multiple chunks 114923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of the same type, then add a short unique string after the "x" to prevent 11493bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% subsequent profiles from overwriting the preceding ones, e.g., 114943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11495bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% -profile PNG-chunk-b01:file01 -profile PNG-chunk-b02:file02 114963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114973241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp% As of version 6.6.6 the following optimizations are always done: 114980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 11499d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o 32-bit depth is reduced to 16. 115000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o 16-bit depth is reduced to 8 if all pixels contain samples whose 115010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% high byte and low byte are identical. 115020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Palette is sorted to remove unused entries and to put a 11503cf002022280cc4dedb2748ad6f415aac1d44f530glennrp% transparent color first, if BUILD_PNG_PALETTE is defined. 115040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Opaque matte channel is removed when writing an indexed PNG. 11505d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Grayscale images are reduced to 1, 2, or 4 bit depth if 11506d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% this can be done without loss and a larger bit depth N was not 115075d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% requested via the "-define png:bit-depth=N" option. 11508d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o If matte channel is present but only one transparent color is 11509d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% present, RGB+tRNS is written instead of RGBA 11510d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Opaque matte channel is removed (or added, if color-type 4 or 6 11511d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% was requested when converting an opaque image). 115120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 115133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 115143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 115153ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1151616ea139d53d867211d3bb0fa859a83de653f687ecristy Image *image,ExceptionInfo *exception) 115173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 115183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1151921f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp excluding, 1152021f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 1152121f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 115223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 115233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 115253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 115263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 115283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 115293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 115315c7cf4e469a4dad7e277783749155932252c52dfglennrp source; 115325c7cf4e469a4dad7e277783749155932252c52dfglennrp 115333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 115353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 11537e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 115383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 11539e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 115403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 11541fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WritePNGImage()"); 115423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 115443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1154673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 115470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 115483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 115493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 115500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 115513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 115533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 115553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 11556a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mng_info->equal_backgrounds=MagickTrue; 115573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 115583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* See if user has requested a specific PNG subformat */ 115603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 115623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 115633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 11564fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48=LocaleCompare(image_info->magick,"PNG48") == 0; 11565fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64=LocaleCompare(image_info->magick,"PNG64") == 0; 115663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11567092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:format"); 11568b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 115695a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp if (value != (char *) NULL || LocaleCompare(image_info->magick,"PNG00") == 0) 11570b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11571f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11572f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " Format=%s",value); 11573f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp 11574fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png8 = MagickFalse; 11575fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 = MagickFalse; 11576fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png32 = MagickFalse; 11577fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 = MagickFalse; 11578fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 = MagickFalse; 11579fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11580b381a2618e8bb9e1e76299676711d0ec1063feabglennrp if (LocaleCompare(value,"png8") == 0) 11581b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png8 = MagickTrue; 11582b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11583b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png24") == 0) 11584b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png24 = MagickTrue; 11585b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11586b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png32") == 0) 11587b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png32 = MagickTrue; 11588fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11589fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (LocaleCompare(value,"png48") == 0) 11590fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 = MagickTrue; 11591fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11592fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (LocaleCompare(value,"png64") == 0) 11593fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 = MagickTrue; 115945830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 115955a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if ((LocaleCompare(value,"png00") == 0) || 115965a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp LocaleCompare(image_info->magick,"PNG00") == 0) 115975830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 115983398b5b62521b49754d9391aae9e4511857bd63bglennrp /* Retrieve png:IHDR.bit-depth-orig and png:IHDR.color-type-orig. */ 115993398b5b62521b49754d9391aae9e4511857bd63bglennrp value=GetImageProperty(image,"png:IHDR.bit-depth-orig",exception); 116006647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11601f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (value != (char *) NULL) 11602f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp { 11603f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11604f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " png00 inherited bit depth=%s",value); 116056647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11606f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (LocaleCompare(value,"1") == 0) 11607f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 1; 116086647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116095a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if (LocaleCompare(value,"2") == 0) 11610f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 2; 116116647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116125a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if (LocaleCompare(value,"4") == 0) 11613f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 4; 116146647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11615f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"8") == 0) 11616f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 8; 116176647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11618f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"16") == 0) 11619f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 16; 11620f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp } 116216647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116223398b5b62521b49754d9391aae9e4511857bd63bglennrp value=GetImageProperty(image,"png:IHDR.color-type-orig",exception); 116236647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11624f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (value != (char *) NULL) 11625f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp { 11626f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11627f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " png00 inherited color type=%s",value); 116286647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11629f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (LocaleCompare(value,"0") == 0) 11630f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 1; 116316647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11632f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"2") == 0) 11633f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 3; 116346647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11635f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"3") == 0) 11636f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 4; 116376647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11638f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"4") == 0) 11639f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 5; 116406647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11641f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"6") == 0) 11642f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 7; 11643f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp } 116445830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 116455830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 116465830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 116473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8) 116483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116499c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 3 */ 4; 116509c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116519c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 116523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png24) 116553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116569c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 2 */ 3; 116579c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116589c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 116590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1166017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 11661def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 116620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 116639c1eb0729653219b9da9037e044501a6dce79d10glennrp else 1166416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorType,exception); 116650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1166616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 116673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png32) 116703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116719c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 6 */ 7; 116729c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116739c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 1167447da46dca23c0c6f51670977d82dce24204c5693dirk image->alpha_trait = BlendPixelTrait; 116750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11676def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 1167716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 116783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11680fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png48) 11681fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 11682fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype = /* 2 */ 3; 11683fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_depth = 16; 11684fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image->depth = 16; 11685fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 1168617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 11687def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 11688fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11689fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else 116904dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SetImageType(image,TrueColorType,exception); 11691fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 116924dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SyncImage(image,exception); 11693fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 11694fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11695fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png64) 11696fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 11697fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype = /* 6 */ 7; 11698fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_depth = 16; 11699fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image->depth = 16; 1170047da46dca23c0c6f51670977d82dce24204c5693dirk image->alpha_trait = BlendPixelTrait; 11701fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11702def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 117034dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SyncImage(image,exception); 11704fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 11705fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11706092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:bit-depth"); 117078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 117083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 117093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 117103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"1") == 0) 117119c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 1; 117120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 117149c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 2; 117150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 117179c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 4; 117180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"8") == 0) 117209c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 117210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"16") == 0) 117239c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 16; 117240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11725bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1172616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11727bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11728bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:bit-depth", 11729bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11730bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 117313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117329c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11733bb8a733a352d1143bf6e823471ccce72aee8189fglennrp " png:bit-depth=%d was defined.\n",mng_info->write_png_depth); 117343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 117350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11736092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:color-type"); 117370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 117393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 117403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We must store colortype+1 because 0 is a valid colortype */ 117413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"0") == 0) 117429c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 1; 117430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1174416ea139d53d867211d3bb0fa859a83de653f687ecristy else if (LocaleCompare(value,"1") == 0) 1174516ea139d53d867211d3bb0fa859a83de653f687ecristy mng_info->write_png_colortype = 2; 1174616ea139d53d867211d3bb0fa859a83de653f687ecristy 117473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 117489c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 3; 117490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"3") == 0) 117519c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 4; 117520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 117549c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 5; 117550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"6") == 0) 117579c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 7; 117580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11759bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1176016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11761bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11762bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:color-type", 11763bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11764bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 117653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117669c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11767d6bf1617e99df0272b231855a933a74e99b6578fglennrp " png:color-type=%d was defined.\n",mng_info->write_png_colortype-1); 117683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 117693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117700e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* Check for chunks to be excluded: 117710e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117720dff56c31fb2f5daa9744018ca533e387c246afcglennrp * The default is to not exclude any known chunks except for any 117730e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * listed in the "unused_chunks" array, above. 117740e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117755d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * Chunks can be listed for exclusion via a "png:exclude-chunk" 117760e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * define (in the image properties or in the image artifacts) 117770e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or via a mng_info member. For convenience, in addition 117780e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * to or instead of a comma-separated list of chunks, the 117790e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string can be simply "all" or "none". 117800e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117810e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The exclude-chunk define takes priority over the mng_info. 117820e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117835d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * A "png:include-chunk" define takes priority over both the 117845d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * mng_info and the "png:exclude-chunk" define. Like the 117850e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string, it can define "all" or "none" as 117860dff56c31fb2f5daa9744018ca533e387c246afcglennrp * well as a comma-separated list. Chunks that are unknown to 117870dff56c31fb2f5daa9744018ca533e387c246afcglennrp * ImageMagick are always excluded, regardless of their "copy-safe" 117880dff56c31fb2f5daa9744018ca533e387c246afcglennrp * status according to the PNG specification, and even if they 11789aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * appear in the "include-chunk" list. Such defines appearing among 11790aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * the image options take priority over those found among the image 11791aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * artifacts. 117920e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117930e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * Finally, all chunks listed in the "unused_chunks" array are 117940e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * automatically excluded, regardless of the other instructions 117950e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or lack thereof. 117960e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117970e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * if you exclude sRGB but not gAMA (recommended), then sRGB chunk 117980e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * will not be written and the gAMA chunk will only be written if it 117990e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is not between .45 and .46, or approximately (1.0/2.2). 118000e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118010e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * If you exclude tRNS and the image has transparency, the colortype 118020e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is forced to be 4 or 6 (GRAY_ALPHA or RGB_ALPHA). 118030e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118040e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The -strip option causes StripImage() to set the png:include-chunk 11805104f206c40efbb0a0eeba846672009345423e969glennrp * artifact to "none,trns,gama". 118060e8ea19baa0666ccfe869d19116372f60fe9230fglennrp */ 118070e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 1180826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_bKGD=MagickFalse; 1180926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_cHRM=MagickFalse; 11810a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 1181126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_EXIF=MagickFalse; /* hex-encoded EXIF in zTXt */ 1181226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_gAMA=MagickFalse; 1181326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_iCCP=MagickFalse; 1181426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* mng_info->ping_exclude_iTXt=MagickFalse; */ 1181526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_oFFs=MagickFalse; 1181626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_pHYs=MagickFalse; 1181726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_sRGB=MagickFalse; 1181826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_tEXt=MagickFalse; 11819fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=MagickFalse; 11820a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 1182126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_vpAg=MagickFalse; 1182226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zCCP=MagickFalse; /* hex-encoded iCCP in zTXt */ 1182326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zTXt=MagickFalse; 1182426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 118258d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickFalse; 118268d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 11827092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:preserve-colormap"); 118288d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value == NULL) 118298b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:preserve-colormap"); 118308d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value != NULL) 118318d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickTrue; 118328d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 11833ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp mng_info->ping_preserve_iCCP=MagickFalse; 11834ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 11835ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp value=GetImageOption(image_info,"png:preserve-iCCP"); 11836ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (value == NULL) 11837ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp value=GetImageArtifact(image,"png:preserve-iCCP"); 11838ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (value != NULL) 11839ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp mng_info->ping_preserve_iCCP=MagickTrue; 11840ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 11841ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* These compression-level, compression-strategy, and compression-filter 118421868258559ddf946fa73ef72dd43507b32623705glennrp * defines take precedence over values from the -quality option. 118431868258559ddf946fa73ef72dd43507b32623705glennrp */ 11844092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-level"); 118451868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 118468b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-level"); 118471868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 118481868258559ddf946fa73ef72dd43507b32623705glennrp { 118491868258559ddf946fa73ef72dd43507b32623705glennrp /* We have to add 1 to everything because 0 is a valid input, 118501868258559ddf946fa73ef72dd43507b32623705glennrp * and we want to use 0 (the default) to mean undefined. 118511868258559ddf946fa73ef72dd43507b32623705glennrp */ 118521868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 118531868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 1; 118541868258559ddf946fa73ef72dd43507b32623705glennrp 118550ffb95c048e16be4f2a8d6aaa76de1dfd7775124glennrp else if (LocaleCompare(value,"1") == 0) 118561868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 2; 118571868258559ddf946fa73ef72dd43507b32623705glennrp 118581868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 118591868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 3; 118601868258559ddf946fa73ef72dd43507b32623705glennrp 118611868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 118621868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 4; 118631868258559ddf946fa73ef72dd43507b32623705glennrp 118641868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 118651868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 5; 118661868258559ddf946fa73ef72dd43507b32623705glennrp 118671868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 118681868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 6; 118691868258559ddf946fa73ef72dd43507b32623705glennrp 118701868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"6") == 0) 118711868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 7; 118721868258559ddf946fa73ef72dd43507b32623705glennrp 118731868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"7") == 0) 118741868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 8; 118751868258559ddf946fa73ef72dd43507b32623705glennrp 118761868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"8") == 0) 118771868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 9; 118781868258559ddf946fa73ef72dd43507b32623705glennrp 118791868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"9") == 0) 118801868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 10; 118811868258559ddf946fa73ef72dd43507b32623705glennrp 118821868258559ddf946fa73ef72dd43507b32623705glennrp else 1188316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 118841868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 118851868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-level", 118861868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 118871868258559ddf946fa73ef72dd43507b32623705glennrp } 118881868258559ddf946fa73ef72dd43507b32623705glennrp 11889092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-strategy"); 118901868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 118918b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-strategy"); 118921868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 118931868258559ddf946fa73ef72dd43507b32623705glennrp { 118941868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 118951868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 118961868258559ddf946fa73ef72dd43507b32623705glennrp 118971868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"1") == 0) 118981868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FILTERED+1; 118991868258559ddf946fa73ef72dd43507b32623705glennrp 119001868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 119011868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 119021868258559ddf946fa73ef72dd43507b32623705glennrp 119031868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 1190498c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ 119051868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_RLE+1; 1190698c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1190798c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1190898c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 119091868258559ddf946fa73ef72dd43507b32623705glennrp 119101868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 1191198c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_FIXED /* Z_FIXED was added to zlib-1.2.2.2 */ 119121868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FIXED+1; 1191398c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1191498c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1191598c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 119161868258559ddf946fa73ef72dd43507b32623705glennrp 119171868258559ddf946fa73ef72dd43507b32623705glennrp else 1191816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 119191868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 119201868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-strategy", 119211868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 119221868258559ddf946fa73ef72dd43507b32623705glennrp } 119231868258559ddf946fa73ef72dd43507b32623705glennrp 11924092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-filter"); 119251868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 119268b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-filter"); 119271868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 119281868258559ddf946fa73ef72dd43507b32623705glennrp { 119291868258559ddf946fa73ef72dd43507b32623705glennrp /* To do: combinations of filters allowed by libpng 119301868258559ddf946fa73ef72dd43507b32623705glennrp * masks 0x08 through 0xf8 119311868258559ddf946fa73ef72dd43507b32623705glennrp * 119321868258559ddf946fa73ef72dd43507b32623705glennrp * Implement this as a comma-separated list of 0,1,2,3,4,5 119331868258559ddf946fa73ef72dd43507b32623705glennrp * where 5 is a special case meaning PNG_ALL_FILTERS. 119341868258559ddf946fa73ef72dd43507b32623705glennrp */ 119351868258559ddf946fa73ef72dd43507b32623705glennrp 119361868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 119371868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 1; 119381868258559ddf946fa73ef72dd43507b32623705glennrp 11939b19b8125320afb5954bd73b82d00700e8ed9e984cristy else if (LocaleCompare(value,"1") == 0) 119401868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 2; 119411868258559ddf946fa73ef72dd43507b32623705glennrp 119421868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 119431868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 3; 119441868258559ddf946fa73ef72dd43507b32623705glennrp 119451868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 119461868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 4; 119471868258559ddf946fa73ef72dd43507b32623705glennrp 119481868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 119491868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 5; 119501868258559ddf946fa73ef72dd43507b32623705glennrp 119511868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 119521868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 6; 119531868258559ddf946fa73ef72dd43507b32623705glennrp 119541868258559ddf946fa73ef72dd43507b32623705glennrp else 1195516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 119561868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 119571868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-filter", 119581868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 119591a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 1196003812ae402fb53d548f0e1d7d14720768f803c2dglennrp 119611a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp for (source=0; source<8; source++) 119625c7cf4e469a4dad7e277783749155932252c52dfglennrp { 119631a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp value = NULL; 11964acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 119652dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 0) 119662dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:exclude-chunks"); 119672dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119682dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 1) 119692dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:exclude-chunks"); 119702dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119712dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 2) 119722dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:exclude-chunk"); 119732dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119742dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 3) 119752dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:exclude-chunk"); 119762dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119772dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 4) 119782dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:include-chunks"); 119792dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119802dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 5) 119812dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:include-chunks"); 119822dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119832dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 6) 119842dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:include-chunk"); 119852dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119862dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 7) 119872dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:include-chunk"); 1198826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 119891a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (value == NULL) 119901a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp continue; 119911a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp 119921a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (source < 4) 119931a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp excluding = MagickTrue; 119941a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else 119951a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp excluding = MagickFalse; 1199626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1199703812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (logging != MagickFalse) 119982cc891a179d622dde7bbb8854138851e828bc6eaglennrp { 119991a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (source == 0 || source == 2) 120001a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120011a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:exclude-chunk=%s found in image options.\n", value); 120021a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else if (source == 1 || source == 3) 120032cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120042cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:exclude-chunk=%s found in image artifacts.\n", value); 120051a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else if (source == 4 || source == 6) 120062cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120071a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:include-chunk=%s found in image options.\n", value); 120081a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else /* if (source == 5 || source == 7) */ 120091a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120101a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:include-chunk=%s found in image artifacts.\n", value); 120112cc891a179d622dde7bbb8854138851e828bc6eaglennrp } 1201203812ae402fb53d548f0e1d7d14720768f803c2dglennrp 120131a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (IsOptionMember("all",value) != MagickFalse) 120141a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp { 120151a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_bKGD=excluding; 120161a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_cHRM=excluding; 120171a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_date=excluding; 120181a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_EXIF=excluding; 120191a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_gAMA=excluding; 120201a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iCCP=excluding; 120211a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp /* mng_info->ping_exclude_iTXt=excluding; */ 120221a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_oFFs=excluding; 120231a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_pHYs=excluding; 120241a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_sRGB=excluding; 120251a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tEXt=excluding; 12026fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding; 120271a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tRNS=excluding; 120281a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_vpAg=excluding; 120291a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zCCP=excluding; 120301a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zTXt=excluding; 120311a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 12032280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp 12033689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("none",value) != MagickFalse) 120341a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp { 12035a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_bKGD=excluding != MagickFalse ? MagickFalse : 12036a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12037a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_cHRM=excluding != MagickFalse ? MagickFalse : 12038a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12039a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_date=excluding != MagickFalse ? MagickFalse : 12040a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12041a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_EXIF=excluding != MagickFalse ? MagickFalse : 12042a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12043a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_gAMA=excluding != MagickFalse ? MagickFalse : 12044a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12045a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_iCCP=excluding != MagickFalse ? MagickFalse : 12046a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 120471a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp /* mng_info->ping_exclude_iTXt=!excluding; */ 12048a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_oFFs=excluding != MagickFalse ? MagickFalse : 12049a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12050a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_pHYs=excluding != MagickFalse ? MagickFalse : 12051a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12052a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_sRGB=excluding != MagickFalse ? MagickFalse : 12053a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12054a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_tEXt=excluding != MagickFalse ? MagickFalse : 12055a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12056fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding != MagickFalse ? MagickFalse : 12057fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk MagickTrue; 12058a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_tRNS=excluding != MagickFalse ? MagickFalse : 12059a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12060a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_vpAg=excluding != MagickFalse ? MagickFalse : 12061a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12062a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_zCCP=excluding != MagickFalse ? MagickFalse : 12063a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12064a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_zTXt=excluding != MagickFalse ? MagickFalse : 12065a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 120661a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 1206703812ae402fb53d548f0e1d7d14720768f803c2dglennrp 12068689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("bkgd",value) != MagickFalse) 120691a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_bKGD=excluding; 120702cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12071689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("chrm",value) != MagickFalse) 120721a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_cHRM=excluding; 12073a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 12074689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("date",value) != MagickFalse) 120751a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_date=excluding; 120762cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12077689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("exif",value) != MagickFalse) 120781a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_EXIF=excluding; 120792cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12080689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("gama",value) != MagickFalse) 120811a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_gAMA=excluding; 120822cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12083689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("iccp",value) != MagickFalse) 120841a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iCCP=excluding; 120852cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12086689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#if 0 12087689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("itxt",value) != MagickFalse) 120881a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iTXt=excluding; 12089689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#endif 120902cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12091689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("offs",value) != MagickFalse) 120921a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_oFFs=excluding; 120932cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12094689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("phys",value) != MagickFalse) 120951a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_pHYs=excluding; 120962cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12097689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("srgb",value) != MagickFalse) 120981a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_sRGB=excluding; 120992cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12100689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("text",value) != MagickFalse) 121011a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tEXt=excluding; 121022cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12103fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (IsOptionMember("time",value) != MagickFalse) 12104fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding; 12105fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 12106689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("trns",value) != MagickFalse) 121071a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tRNS=excluding; 12108a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp 12109689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("vpag",value) != MagickFalse) 121101a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_vpAg=excluding; 121112cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12112689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("zccp",value) != MagickFalse) 121131a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zCCP=excluding; 121142cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12115689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("ztxt",value) != MagickFalse) 121161a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zTXt=excluding; 1211726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1211826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 121191a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (logging != MagickFalse) 1212026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1212126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 121225d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Chunks to be excluded from the output png:"); 1212326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_bKGD != MagickFalse) 1212426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1212526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " bKGD"); 1212626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_cHRM != MagickFalse) 1212726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1212826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " cHRM"); 12129a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (mng_info->ping_exclude_date != MagickFalse) 12130a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12131a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp " date"); 1213226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_EXIF != MagickFalse) 1213326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1213426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " EXIF"); 1213526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_gAMA != MagickFalse) 1213626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1213726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " gAMA"); 1213826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iCCP != MagickFalse) 1213926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1214026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iCCP"); 12141689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#if 0 1214226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iTXt != MagickFalse) 1214326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1214426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iTXt"); 12145689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#endif 12146689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp 1214726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_oFFs != MagickFalse) 1214826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1214926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " oFFs"); 1215026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_pHYs != MagickFalse) 1215126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " pHYs"); 1215326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_sRGB != MagickFalse) 1215426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " sRGB"); 1215626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_tEXt != MagickFalse) 1215726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " tEXt"); 12159fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (mng_info->ping_exclude_tIME != MagickFalse) 12160fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12161fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk " tIME"); 12162a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (mng_info->ping_exclude_tRNS != MagickFalse) 12163a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12164a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp " tRNS"); 1216526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_vpAg != MagickFalse) 1216626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1216726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " vpAg"); 1216826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zCCP != MagickFalse) 1216926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1217026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zCCP"); 1217126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zTXt != MagickFalse) 1217226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1217326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zTXt"); 1217426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1217526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 12176b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickTrue; 121773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1217816ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 121793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 121810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WritePNGImage()"); 121840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 121863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 121873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 121893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Write one JNG image */ 121913ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOneJNGImage(MngInfo *mng_info, 1219216ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *image_info,Image *image,ExceptionInfo *exception) 121933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 121943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 121953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image; 121963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 121983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image_info; 121993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1220103812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 122023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 122033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 122053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 122063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 122083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blob, 122093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[80], 122103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 122113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 122133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 122143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 122153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 122163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent; 122173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12218bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1221959575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality, 122203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_quality; 122213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 12223fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOneJNGImage()"); 122243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) NULL; 122263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=(Image *) NULL; 122273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) NULL; 122287e99a06aa771c9e270e7940731dbf9f2ab2c09b1glennrp length=0; 122293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickTrue; 12231def23e5d7331b1a13ed593b6d6aca516da382328cristy transparent=image_info->type==GrayscaleAlphaType || 1223244c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp image_info->type==TrueColorAlphaType || 1223344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp image->alpha_trait != UndefinedPixelTrait; 122343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122354b917593e694424be469d250448c05c878663812glennrp jng_alpha_sample_depth = 0; 122364b917593e694424be469d250448c05c878663812glennrp 1223759575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_quality=image_info->quality == 0UL ? 75UL : image_info->quality%1000; 1223859575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1223959575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=image->compression==JPEGCompression? 8 : 0; 1224059575fa5c228308a41d7f5028390be2083aaaf6dglennrp 12241750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp jng_alpha_quality=image_info->quality == 0UL ? 75UL : 1224259575fa5c228308a41d7f5028390be2083aaaf6dglennrp image_info->quality; 1224359575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1224459575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (jng_alpha_quality >= 1000) 1224559575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality /= 1000; 122463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12247d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp length=0; 12248d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp 122498fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 122503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 122513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=14; 122520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Create JPEG blob, image, and image_info */ 122543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 122553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1225616ea139d53d867211d3bb0fa859a83de653f687ecristy " Creating jpeg_image_info for alpha."); 122570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 122590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 122613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 122620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 122643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 122653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 122660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1226716ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=SeparateImage(image,AlphaChannel,exception); 122683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 122693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 12270151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 122718a46d827a124555f0c48fb2368ec1bba8e079ab6cristy jpeg_image->alpha_trait=UndefinedPixelTrait; 122728f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp jpeg_image->quality=jng_alpha_quality; 1227316ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image_info->type=GrayscaleType; 1227416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(jpeg_image,GrayscaleType,exception); 122753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 12276151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(jpeg_image_info->filename,MagickPathExtent, 122773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",jpeg_image->filename); 122783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1227959575fa5c228308a41d7f5028390be2083aaaf6dglennrp else 1228059575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1228159575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=0; 1228259575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_color_type=10; 1228359575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_sample_depth=0; 1228459575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 122853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: check bit depth of PNG alpha channel */ 122873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if image is grayscale. */ 12289def23e5d7331b1a13ed593b6d6aca516da382328cristy if (image_info->type != TrueColorAlphaType && image_info->type != 12290f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk TrueColorType && SetImageGray(image,exception)) 122913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type-=2; 122923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1229359575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (logging != MagickFalse) 1229459575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1229559575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1229659575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Quality = %d",(int) jng_quality); 1229759575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1229859575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Color Type = %d",jng_color_type); 122998fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 1230059575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1230159575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1230259575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Compression = %d",jng_alpha_compression_method); 1230359575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1230459575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Depth = %d",jng_alpha_sample_depth); 1230559575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1230659575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Quality = %d",(int) jng_alpha_quality); 1230759575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1230859575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1230959575fa5c228308a41d7f5028390be2083aaaf6dglennrp 123108fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 123113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 123123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 123133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 123143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 123153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 123163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1231716ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale PNG blob */ 123183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1231916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 1232044c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1232144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1232244c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 123233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 123253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating PNG blob."); 123263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12327151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"PNG",MagickPathExtent); 12328151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"PNG",MagickPathExtent); 123293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 123303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12331cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* Exclude all ancillary chunks */ 12332cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp (void) SetImageArtifact(jpeg_image,"png:exclude-chunks","all"); 12333cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 12334b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image, 12335b3f97ae45019a91b30792a6fa42d81a2689a7025cristy &length,exception); 123363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Retrieve sample depth used */ 1233816ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(jpeg_image,"png:bit-depth-written",exception); 123393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 123403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth= (unsigned int) value[0]; 123413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 123433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1234416ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale JPEG blob */ 123453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1234716ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 1234844c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1234944c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1235044c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 123513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12352151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MagickPathExtent); 12353151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 123543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 123553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 123573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 12358b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image,&length, 1235916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 123603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 123610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 123623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12364e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 12365e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 123663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Destroy JPEG image and image_info */ 123693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 123703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 123713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 123723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JHDR chunk */ 123753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,16L); /* chunk data length=16 */ 123763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JHDR); 1237703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JHDR,16L); 123784e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) image->columns); 123794e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) image->rows); 123803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=jng_color_type; 123813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[13]=8; /* sample depth */ 123823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=8; /*jng_image_compression_method */ 123833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[15]=(unsigned char) (image_info->interlace == NoInterlace ? 0 : 8); 123843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[16]=jng_alpha_sample_depth; 123853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[17]=jng_alpha_compression_method; 123863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[18]=0; /*jng_alpha_filter_method */ 123873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[19]=0; /*jng_alpha_interlace_method */ 123883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,20,chunk); 123893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); 123903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 123923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12393f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG width:%15lu",(unsigned long) image->columns); 123940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 123953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12396f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG height:%14lu",(unsigned long) image->rows); 123970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 123983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 123993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG color type:%10d",jng_color_type); 124000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG sample depth:%8d",8); 124030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG compression:%9d",8); 124060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG interlace:%11d",0); 124090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha depth:%9d",jng_alpha_sample_depth); 124120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha compression:%3d",jng_alpha_compression_method); 124150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha filter:%8d",0); 124180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha interlace:%5d",0); 124213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* Write any JNG-chunk-b profiles */ 12424cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-b",logging); 124253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write leading ancillary chunks 124283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124308fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 124313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG bKGD chunk 124343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 124373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue, 124383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 124393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red; 124403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12441bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 124423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes; 124433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 124453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=6L; 124463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=10L; 12448bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) (num_bytes-4L)); 124493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1245003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,(size_t) (num_bytes-4L)); 124513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToChar(image->background_color.red); 124523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToChar(image->background_color.green); 124533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToChar(image->background_color.blue); 124543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+4)=0; 124553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+5)=red; 124563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+6)=0; 124573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+7)=green; 124583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+8)=0; 124593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+9)=blue; 124603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) num_bytes,chunk); 124613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) num_bytes)); 124623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent)) 124653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG sRGB chunk 124683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 124703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1247103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 124720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 12474e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12475cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12476e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 124770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 12479e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12480cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12481e610a071534e448c46460a5aa39ede33bf56b329glennrp (PerceptualIntent)); 124820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 124843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 124853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma != 0.0) 124893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG gAMA chunk 124923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 124943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1249503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1249635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 124973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 124983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 124993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->equal_chrms == MagickFalse) && 125023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->chromaticity.red_primary.x != 0.0)) 125033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 125053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 125063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG cHRM chunk 125093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 125113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1251203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 125133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1251435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1251535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 125163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1251735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1251835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 125193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1252035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1252135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 125223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1252335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1252435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 125253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 125263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 125273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1253016ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && !mng_info->equal_physs) 125313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG pHYs chunk 125343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 125363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1253703812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 125383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 125393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1254035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1254116ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 125420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1254335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1254416ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 125450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 125473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 125503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 125523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1255335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1255416ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 125550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1255635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1255716ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 125580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 125603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 125633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1256416ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1256516ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 125663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 125673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 125703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 125713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.x || image->page.y)) 125743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG oFFs chunk 125773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 125793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_oFFs); 1258003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_oFFs,9L); 12581bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+4,(ssize_t) (image->page.x)); 12582bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+8,(ssize_t) (image->page.y)); 125833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 125843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 125853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 125863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.width || image->page.height)) 125883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 125903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_vpAg); 1259103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 125923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+4,(png_uint_32) image->page.width); 125933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) image->page.height); 125943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; /* unit = pixels */ 125953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 125963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 125973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125998fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 126003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 126023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12603bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 126043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 126053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12606fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy size_t 126073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len; 126083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IDAT chunk header */ 126103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12612e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write IDAT chunks from blob, length=%.20g.",(double) 12613f2faecf9facdbbb14fcba373365f9f691a9658e0cristy length); 126143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Copy IDAT chunks */ 126163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=0; 126173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=blob+8; 12618bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=8; i<(ssize_t) length; i+=len+12) 126193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126205389e5ad63c880fe6885e3b24c76acbdbf63bd61cristy len=(size_t) (*p<<24)|((*(p+1))<<16)|((*(p+2))<<8)|(*(p+3)); 126213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 126220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*(p)==73 && *(p+1)==68 && *(p+2)==65 && *(p+3)==84) /* IDAT */ 126243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Found an IDAT chunk. */ 12626fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlobMSBULong(image,len); 12627fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy LogPNGChunk(logging,mng_IDAT,len); 12628fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlob(image,len+4,p); 12629fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlobMSBULong(image, crc32(0,p,(uInt) len+4)); 126303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 126333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12636e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping %c%c%c%c chunk, length=%.20g.", 12637e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy *(p),*(p+1),*(p+2),*(p+3),(double) len); 126383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=(8+len); 126403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126427e99a06aa771c9e270e7940731dbf9f2ab2c09b1glennrp else if (length != 0) 126433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAA chunk header */ 126453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12647e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAA chunk, length=%.20g.",(double) length); 12648bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 126493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAA); 1265003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAA,length); 126513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) data */ 126523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 126533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 126543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob, 126553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) length)); 126563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 126583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode image as a JPEG blob */ 126613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 126633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image_info."); 126643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 126653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 126663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 126673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 126703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 126713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1267216ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=CloneImage(image,0,0,MagickTrue,exception); 126733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 126743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 12675151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 126763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 12678151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(jpeg_image_info->filename,MagickPathExtent,"%s", 126793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->filename); 126803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1268216ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 126833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12686e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Created jpeg_image, %.20g x %.20g.",(double) jpeg_image->columns, 12687e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) jpeg_image->rows); 126883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1268944c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1269044c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1269144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 126923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 126933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->type=GrayscaleType; 126940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1269559575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image_info->quality=jng_quality; 1269659575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image->quality=jng_quality; 12697151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MagickPathExtent); 12698151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 126990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 127023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 127030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12704b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image,&length, 12705b3f97ae45019a91b30792a6fa42d81a2689a7025cristy exception); 127060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12710e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 12711e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 127123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12714e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAT chunk, length=%.20g.",(double) length); 127153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) */ 12718bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 127193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAT); 1272003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAT,length); 127213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 127223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 127233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob,(uInt) length)); 127243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 127263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 127273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 127283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 127293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write any JNG-chunk-e profiles */ 12731cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-e",logging); 127323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IEND chunk */ 127343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0L); 127353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_IEND); 1273603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0); 127373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 127383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 127393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 127423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOneJNGImage()"); 127430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 127453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 127463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 127493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e J N G I m a g e % 127543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteJNGImage() writes a JPEG Network Graphics (JNG) image file. 127603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 127623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteJNGImage method is: 127643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1276516ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteJNGImage(const ImageInfo *image_info, 1276616ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 127673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 127693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 127713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 127733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1277416ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1277516ea139d53d867211d3bb0fa859a83de653f687ecristy% 127763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1277816ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image, 1277916ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 127803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 127813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1278221f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 1278303812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 127843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 127853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 127873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 127883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 127903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 127913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 127923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 12793e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 127943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 12795e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 127963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12797fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteJNGImage()"); 1279816ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 127993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 128003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 128013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 128043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1280673bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 128073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 128083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 128093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 128113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 128133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 128143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 128153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\213JNG\r\n\032\n"); 128173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1281816ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,image_info,image,exception); 128193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 128203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 128223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 128233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 128243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteJNGImage()"); 128253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 128263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 128273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 128283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1282916ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image, 1283016ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 128313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 128323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 128333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *option; 128343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 128363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image; 128373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1283921f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 128403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 128413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1284203812ae402fb53d548f0e1d7d14720768f803c2dglennrp volatile MagickBooleanType 1284303812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging; 1284403812ae402fb53d548f0e1d7d14720768f803c2dglennrp 128453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 128463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 128473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 128493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count, 128503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations, 128513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte; 128523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 128543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 128553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 128563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte, 128573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 128583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray, 128593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi, 128603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte; 128613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12862bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 128633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 128643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 128663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[800]; 128673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 128693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng, 128703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng; 128713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12872bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 128733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 128743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12875bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 128763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=0, 128773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay; 128783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12879d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER < 10200) 128803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 128813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 128823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 128833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 128843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 128873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 12889e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 128903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 12891e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 128923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12893fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteMNGImage()"); 1289416ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 128953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 128963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 128973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 129003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1290273bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 129033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 129043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 129053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 129073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 129093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 129103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 129113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng=LocaleCompare(image_info->magick,"MNG") == 0; 129123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See if user has requested a specific PNG subformat to be used 129153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * for all of the PNGs in the MNG being written, e.g., 129163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 129173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * convert *.png png8:animation.mng 129183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 129193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * To do: check -define png:bit_depth and png:color_type as well, 129203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * or perhaps use mng:bit_depth and mng:color_type instead for 129213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * global settings. 129223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 129253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 129263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 129273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickFalse; 129293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 129303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickTrue; 129313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->adjoin=image_info->adjoin && 129333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && write_mng; 129343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 129363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Log some info about the input */ 129383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 129393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 129403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129422dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Checking input image(s)\n" 129432dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Image_info depth: %.20g, Type: %d", 129442dd1906783a5ece58a6105b4f59239e28b13caddglennrp (double) image_info->depth, image_info->type); 129453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 129473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 129483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12951280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " Scene: %.20g\n, Image depth: %.20g", 12952280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp (double) scene++, (double) p->depth); 129530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1295417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (p->alpha_trait != UndefinedPixelTrait) 129553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: True"); 129570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: False"); 129610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->storage_class == PseudoClass) 129633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: PseudoClass"); 129650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: DirectClass"); 129690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->colors) 129713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12972e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Number of colors: %.20g",(double) p->colors); 129730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Number of colors: unspecified"); 129770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 129793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 129803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 129843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 129853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 129863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 129873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 129883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickFalse; 129893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickFalse; 129903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 129913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=1; 129923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 129943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->page != (char *) NULL) 129953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine image bounding box. 129983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetGeometry(image,&mng_info->page); 130003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseMetaGeometry(image_info->page,&mng_info->page.x, 130013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &mng_info->page.y,&mng_info->page.width,&mng_info->page.height); 130023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 130043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 130063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom; 130073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 130093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red, 130103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 130113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue; 130123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 130143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickTrue; 130153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.width || mng_info->page.height) 130163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickFalse; 130173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Check all the scenes. 130193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay=image->delay; 130213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 130223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=image->chromaticity.red_primary.x != 0.0; 130233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickTrue, 130243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickTrue; 130253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickTrue; 130263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickTrue; 130273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 130283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 130293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 130303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickTrue; 130313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 130323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickFalse; 130333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 130343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next_image=image; next_image != (Image *) NULL; ) 130353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_geom) 130373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->columns+next_image->page.x) > mng_info->page.width) 130393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.width=next_image->columns+next_image->page.x; 130400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->rows+next_image->page.y) > mng_info->page.height) 130423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.height=next_image->rows+next_image->page.y; 130433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->page.x || next_image->page.y) 130463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickTrue; 130470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1304817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (next_image->alpha_trait != UndefinedPixelTrait) 130493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickTrue; 130500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) next_image->dispose >= BackgroundDispose) 1305217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((next_image->alpha_trait != UndefinedPixelTrait) || 13053dc2d327c3b86b0567bdcf9b4d04b5e4663864480cristy next_image->page.x || next_image->page.y || 130543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((next_image->columns < mng_info->page.width) && 130553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->rows < mng_info->page.height))) 130563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 130570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->iterations) 130593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickTrue; 130600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=next_image->delay; 130620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != initial_delay || final_delay > 1UL* 130643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->ticks_per_second) 130653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=1; 130660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 130683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 130693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check for global palette possibility. 130713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1307217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 130733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 130740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte == 0) 130763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13077f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk if (SetImageGray(image,exception) == MagickFalse) 130783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 130793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,next_image); 130803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (use_global_plte == 0) 130813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=mng_info->equal_palettes; 130823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=!mng_info->equal_palettes; 130833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 130853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(next_image) != (Image *) NULL) 130863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->background_color.red != 130883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.red || 130893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.green != 130903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.green || 130913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.blue != 130923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.blue) 130933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 130940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->gamma != next_image->next->gamma) 130963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 130970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->rendering_intent != 130993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->rendering_intent) 131003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 131010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->units != next_image->next->units) || 1310316ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.x != next_image->next->resolution.x) || 1310416ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.y != next_image->next->resolution.y)) 131053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 131060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 131083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->chromaticity.red_primary.x != 131103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.x || 131113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.red_primary.y != 131123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.y || 131133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.x != 131143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.x || 131153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.y != 131163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.y || 131173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.x != 131183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.x || 131193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.y != 131203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.y || 131213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.x != 131223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.x || 131233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.y != 131243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.y) 131253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 131263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 131293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next_image); 131303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count < 2) 131323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 131343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 131353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 131363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 131373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 131383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 131393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 131403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 131413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 131423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 131433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram == MagickFalse) 131463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Only certain framing rates 100/n are exactly representable without 131493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the FRAM chunk but we'll allow some slop in VLC files 131503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay == 0) 131523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_iterations != MagickFalse) 131543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy It's probably a GIF with loop; don't run it *too* fast. 131573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131580261712cdc8fb4765add50146936e3ba2cb9fefaglennrp if (mng_info->adjoin) 13159d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp { 13160d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp final_delay=10; 1316116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 1316216ea139d53d867211d3bb0fa859a83de653f687ecristy CoderWarning, 13163d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp "input has zero delay between all frames; assuming", 13164d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp " 10 cs `%s'",""); 13165d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp } 131663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 131683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=0; 131693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != 0) 13171cf002022280cc4dedb2748ad6f415aac1d44f530glennrp mng_info->ticks_per_second=(png_uint_32) 13172cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (image->ticks_per_second/final_delay); 131733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 50) 131743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=2; 131750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 75) 131773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1; 131780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 125) 131803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 131810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi && final_delay > 2 && (final_delay != 4) && 131833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 5) && (final_delay != 10) && (final_delay != 20) && 13184b9d46a1991a7ff58b567caff7ab7461dfe8cb7c7cristy (final_delay != 25) && (final_delay != 50) && 131850bf214346985a874b4fdc1e2631983bfea5155cddirk (final_delay != (size_t) image->ticks_per_second)) 131863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; /* make it exact; cannot be VLC */ 131873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram != MagickFalse) 13190b9d46a1991a7ff58b567caff7ab7461dfe8cb7c7cristy mng_info->ticks_per_second=image->ticks_per_second; 131913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If pseudocolor, we should also check to see if all the 131933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palettes are identical and write a global PLTE if they are. 131943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ../glennrp Feb 99. 131953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MNG version 1.0 signature and MHDR chunk. 131983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\212MNG\r\n\032\n"); 132003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,28L); /* chunk data length=28 */ 132013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MHDR); 1320203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MHDR,28L); 132034e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) mng_info->page.width); 132044e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.height); 132053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,mng_info->ticks_per_second); 132063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+16,0L); /* layer count=unknown */ 132073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+20,0L); /* frame count=unknown */ 132083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+24,0L); /* play time=unknown */ 132093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_jng) 132103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 132123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,27L); /* simplicity=LC+JNG */ 132150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,25L); /* simplicity=VLC+JNG */ 132183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,19L); /* simplicity=LC+JNG, no transparency */ 132240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,17L); /* simplicity=VLC+JNG, no transparency */ 132273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 132333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,11L); /* simplicity=LC */ 132360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,9L); /* simplicity=VLC */ 132393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,3L); /* simplicity=LC, no transparency */ 132450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,1L); /* simplicity=VLC, no transparency */ 132483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,32,chunk); 132513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,32)); 13252092ec8d083fedaedfb7792995e7ea42164553cffcristy option=GetImageOption(image_info,"mng:need-cacheoff"); 132533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (option != (const char *) NULL) 132543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 132563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 132573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 132583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write "nEED CACHEOFF" to turn playback caching off for streaming MNG. 132603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_nEED); 132623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=CopyMagickString((char *) chunk+4,"CACHEOFF",20); 13263bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 1326403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_nEED,(size_t) length); 132653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length+=4; 132663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,chunk); 132673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) length)); 132683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((GetPreviousImageInList(image) == (Image *) NULL) && 132703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && 132713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->iterations != 1)) 132723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG TERM chunk 132753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 132773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_TERM); 1327803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_TERM,10L); 132793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=3; /* repeat animation */ 132803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* show last frame when done */ 132813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+6,(png_uint_32) (mng_info->ticks_per_second* 132823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/MagickMax(image->ticks_per_second,1))); 132830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 132853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,PNG_UINT_31_MAX); 132860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) image->iterations); 132890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 132913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13293e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM delay: %.20g",(double) (mng_info->ticks_per_second* 13294e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy final_delay/MagickMax(image->ticks_per_second,1))); 132950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 132973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13298e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM iterations: %.20g",(double) PNG_UINT_31_MAX); 132990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13302e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image iterations: %.20g",(double) image->iterations); 133033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 133053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 133063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 133093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent) && 133113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs) 133123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG sRGB chunk 133153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 133173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1331803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 133190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 13321e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 13322cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 13323e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 133240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 13326e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 13327cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 13328cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (PerceptualIntent)); 133290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 133313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 133323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_srgb=MagickTrue; 133333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma && mng_info->equal_gammas) 133383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG gAMA chunk 133413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 133433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1334403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1334535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 133463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 133473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 133483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_gama=MagickTrue; 133493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 133513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 133533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 133543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 133553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG cHRM chunk 133573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 133593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1336003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 133613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1336235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1336335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 133643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1336535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1336635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 133673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1336835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1336935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 133703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1337135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1337235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 133733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 133743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 133753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_chrm=MagickTrue; 133763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1337816ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && mng_info->equal_physs) 133793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG pHYs chunk 133823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 133843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1338503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 133860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 133883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1338935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1339016ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 133910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1339235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1339316ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 133940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 133963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 134013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1340235ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1340316ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 134040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1340535ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1340616ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 134070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 134093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 134123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1341316ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1341416ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 134153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 134163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 134193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 134203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 134223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG BACK chunk and global bKGD chunk, if the image is transparent 134233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy or does not cover the entire frame. 134243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1342517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (write_mng && ((image->alpha_trait != UndefinedPixelTrait) || 13426dc2d327c3b86b0567bdcf9b4d04b5e4663864480cristy image->page.x > 0 || image->page.y > 0 || (image->page.width && 134273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->page.width+image->page.x < mng_info->page.width)) 134283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy || (image->page.height && (image->page.height+image->page.y 134293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy < mng_info->page.height)))) 134303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 134323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_BACK); 1343303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_BACK,6L); 134343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToShort(image->background_color.red); 134353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToShort(image->background_color.green); 134363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToShort(image->background_color.blue); 134373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+4,red); 134383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+6,green); 134393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+8,blue); 134403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 134413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 134423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_backgrounds) 134433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 134453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1344603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,6L); 134473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 134483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 134493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 134523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 134533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((need_local_plte == MagickFalse) && 134543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class == PseudoClass) && 134553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (all_images_are_gray == MagickFalse)) 134563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13457bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 134583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 134593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 134603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 134613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 134623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 134633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 134643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 134653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1346603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 134670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13468bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 134693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1347016ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[4+i*3]=(unsigned char) (ScaleQuantumToChar( 1347116ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red) & 0xff); 1347216ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[5+i*3]=(unsigned char) (ScaleQuantumToChar( 1347316ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green) & 0xff); 1347416ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[6+i*3]=(unsigned char) (ScaleQuantumToChar( 1347516ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue) & 0xff); 134763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 134793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) (data_length+4))); 134803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 134813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 134833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 134853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->delay=0; 134863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 134873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 134883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 134893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 134903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 134913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin) 134933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 134953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 134963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 134973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If we aren't using a global palette for the entire MNG, check to 134983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy see if we can use one for two or more consecutive images. 134993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 135003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte && use_global_plte && !all_images_are_gray) 135013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 135033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy When equal_palettes is true, this image has the same palette 135063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy as the previous PseudoClass image 135073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 135083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=mng_info->equal_palettes; 135093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,image->next); 135103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_palettes && !mng_info->have_write_global_plte) 135113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 135143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 13515bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 135163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 135173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 135193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 135203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1352103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 135220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13523bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 135243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red); 135263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green); 135273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue); 135283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 135303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 135313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk, 135323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) (data_length+4))); 135333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 135343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 135373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickFalse; 135383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 135403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi) 135413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13542bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 135433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x, 135443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y; 135453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scene) 135473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=mng_info->page.x; 135493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=mng_info->page.y; 135503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 135523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=0; 135543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=0; 135553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 135573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->page.x != previous_x) || 135583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->page.y != previous_y)) 135593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,12L); /* data length=12 */ 135613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_DEFI); 1356203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_DEFI,12L); 135633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=0; /* object 0 MSB */ 135643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* object 0 LSB */ 135653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=0; /* visible */ 135663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* abstract */ 135673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.x); 135683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,(png_uint_32) mng_info->page.y); 135693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,16,chunk); 135703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,16)); 135713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_mng=write_mng; 135763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) image->dispose >= 3) 135783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 135793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && mng_info->adjoin && 135813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->delay != mng_info->delay) || 135823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->framing_mode != mng_info->old_framing_mode))) 135833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay == mng_info->delay) 135853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the new framing mode. 135883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 135893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); /* data length=1 */ 135903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1359103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,1L); 135923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 135933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 135943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 135953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 135973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the delay. 136003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 136013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 136023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1360303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,10L); 136043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 136053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 136063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=2; /* flag for changing default delay */ 136073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 136083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=0; /* flag for changing frame clipping */ 136093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 136103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) 136113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((mng_info->ticks_per_second* 136123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay)/MagickMax(image->ticks_per_second,1))); 136133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 136143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 136154e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy mng_info->delay=(png_uint_32) image->delay; 136163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=mng_info->framing_mode; 136183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 136213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 136223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 136243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_info; 136253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 136273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 136283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing JNG object."); 136293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: specify the desired alpha compression method. */ 136303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=CloneImageInfo(image_info); 136313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info->compression=UndefinedCompression; 1363216ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,write_info,image,exception); 136333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=DestroyImageInfo(write_info); 136343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 136363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 136373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 136393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 136403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG object."); 136412f2e514554975d510c88df54de98c6cdc1080f1cglennrp 13642b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickFalse; 136438d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap = MagickFalse; 136442f2e514554975d510c88df54de98c6cdc1080f1cglennrp 136452f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* We don't want any ancillary chunks written */ 136462f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_bKGD=MagickTrue; 136472f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_cHRM=MagickTrue; 13648a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 136492f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_EXIF=MagickTrue; 136502f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_gAMA=MagickTrue; 136512f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_iCCP=MagickTrue; 136522f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* mng_info->ping_exclude_iTXt=MagickTrue; */ 136532f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_oFFs=MagickTrue; 136542f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_pHYs=MagickTrue; 136552f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_sRGB=MagickTrue; 136562f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_tEXt=MagickTrue; 13657a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 136582f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_vpAg=MagickTrue; 136592f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zCCP=MagickTrue; 136602f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zTXt=MagickTrue; 136612f2e514554975d510c88df54de98c6cdc1080f1cglennrp 1366216ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 136633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 136663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 136683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 136693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 136703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 136723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 136733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 136743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 136753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,SaveImagesTag,scene++, 136763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(image)); 136770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 136783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 136793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 136800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 136813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (mng_info->adjoin); 136820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 136833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 136843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 136863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 136873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 136883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MEND chunk. 136893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 136903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0x00000000L); 136913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MEND); 1369203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MEND,0L); 136933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 136943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 136953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 136973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 136983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 136993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 137003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 137010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 137033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()"); 137040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 137063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13707d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#else /* PNG_LIBPNG_VER > 10011 */ 1370839992b4dd9b12ef752d55b8e402c069698851f72glennrp 137093ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) 137103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 137113bd393f9074299ed9f2f3d128e4985118077c2bdglennrp (void) image; 137123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 137133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 137140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(CoderError,"PNG library is too old", 137163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 137173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1371839992b4dd9b12ef752d55b8e402c069698851f72glennrp 137193ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 137203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 137213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(WritePNGImage(image_info,image)); 137223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13723d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 137243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13725