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 304426ac8585e46188a648abf5fa3a1a7d264d8b3cb9Cristy 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; 312269ea6b579b2139f338ada844963c97d69e0cd26eCristy image->alpha_trait= 312369ea6b579b2139f338ada844963c97d69e0cd26eCristy (((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 312469ea6b579b2139f338ada844963c97d69e0cd26eCristy ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 312569ea6b579b2139f338ada844963c97d69e0cd26eCristy (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 312669ea6b579b2139f338ada844963c97d69e0cd26eCristy BlendPixelTrait : UndefinedPixelTrait; 31271b888c4e54e47ba7659d081d3c2d72dfb2d09bacglennrp 31283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3130e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping PNG image data for scene %.20g",(double) 31313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->scenes_found-1); 31323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 3133edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 3134868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3135cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 31363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3137edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 31383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()."); 31410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 31433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 31440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading PNG IDAT chunk(s)"); 31480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3149a701bb35fa5f33c41f4053b39e0f4c4c20ec17d4Cristy status=SetImageExtent(image,image->columns,image->rows,exception); 3150a701bb35fa5f33c41f4053b39e0f4c4c20ec17d4Cristy if (status == MagickFalse) 3151a701bb35fa5f33c41f4053b39e0f4c4c20ec17d4Cristy return(DestroyImageList(image)); 3152a701bb35fa5f33c41f4053b39e0f4c4c20ec17d4Cristy 31533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 31540997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(image->rows,ping_rowbytes* 3155cf002022280cc4dedb2748ad6f415aac1d44f530glennrp sizeof(*ping_pixels)); 31560997332e2c35a821b271d6e7473c01c10dc206adcristy else 31570997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(ping_rowbytes,sizeof(*ping_pixels)); 31580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31590997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info == (MemoryInfo *) NULL) 3160edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 31610997332e2c35a821b271d6e7473c01c10dc206adcristy ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); 31620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 31643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 31653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Converting PNG pixels to pixel packets"); 31663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 31673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PNG pixels to pixel packets. 31683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 31695f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 317016ea139d53d867211d3bb0fa859a83de653f687ecristy 317116ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info == (QuantumInfo *) NULL) 3172edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Failed to allocate quantum_info"); 31730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 31744b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp (void) SetQuantumEndian(image,quantum_info,MSBEndian); 31754b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp 3176c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3177c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3178c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp MagickBooleanType 3179c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel; 3180c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3181c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel=MagickFalse; 3182c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 31833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == DirectClass) 31843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3185c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (pass=0; pass < num_passes; pass++) 3186c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3187c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* 3188c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp Convert image to DirectClass pixel packets. 3189c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp */ 3190ccc36af759d30fb50b1deda241d038402a393b17glennrp image->alpha_trait= 3191ccc36af759d30fb50b1deda241d038402a393b17glennrp (((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 3192c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 3193c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 3194b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 31950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3196c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (y=0; y < (ssize_t) image->rows; y++) 3197c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3198c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (num_passes > 1) 3199c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=ping_rowbytes*y; 32000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3201c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 3202c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp row_offset=0; 32030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3204cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 3205c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3206c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp if (pass < num_passes-1) 3207c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp continue; 3208c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3209862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 32103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 321116ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 3212c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 32130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 321416ea139d53d867211d3bb0fa859a83de653f687ecristy if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY) 321516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 321616ea139d53d867211d3bb0fa859a83de653f687ecristy GrayQuantum,ping_pixels+row_offset,exception); 32170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 321816ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 321916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 322016ea139d53d867211d3bb0fa859a83de653f687ecristy GrayAlphaQuantum,ping_pixels+row_offset,exception); 32210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 322216ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 322316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 322416ea139d53d867211d3bb0fa859a83de653f687ecristy RGBAQuantum,ping_pixels+row_offset,exception); 32250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 322616ea139d53d867211d3bb0fa859a83de653f687ecristy else if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 322716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 322816ea139d53d867211d3bb0fa859a83de653f687ecristy IndexQuantum,ping_pixels+row_offset,exception); 32290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 323016ea139d53d867211d3bb0fa859a83de653f687ecristy else /* ping_color_type == PNG_COLOR_TYPE_RGB */ 323116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ImportQuantumPixels(image,(CacheView *) NULL,quantum_info, 323216ea139d53d867211d3bb0fa859a83de653f687ecristy RGBQuantum,ping_pixels+row_offset,exception); 32333faa9a3fb01696daaf976d595f492cb530bffb21glennrp 3234c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel == MagickFalse) 3235c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3236c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp /* Is there a transparent pixel in the row? */ 3237a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (y== 0 && logging != MagickFalse) 3238a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3239a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Looking for cheap transparent pixel"); 3240a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3241c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 3242c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 32435aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if ((ping_color_type == PNG_COLOR_TYPE_RGBA || 32445aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) && 324516ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,q) != OpaqueAlpha)) 3246c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3247a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3248a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3249a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 3250a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 3251c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp found_transparent_pixel = MagickTrue; 3252c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3253c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32544f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((ping_color_type == PNG_COLOR_TYPE_RGB || 32554f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_color_type == PNG_COLOR_TYPE_GRAY) && 325616ea139d53d867211d3bb0fa859a83de653f687ecristy (ScaleQuantumToShort(GetPixelRed(image,q)) == 325716ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 325816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 325916ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 326016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 326116ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue)) 32624f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 3263a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 3264a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3265a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " ...got one."); 32664f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp found_transparent_pixel = MagickTrue; 32674f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 32684f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 326916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 3270c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3271c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3273af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes == 1) 3274c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3275af9320404a7b05014476f844b11110157a21b73eglennrp status=SetImageProgress(image,LoadImageTag, 3276af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) y, image->rows); 32770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3278c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (status == MagickFalse) 3279c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3280c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3281c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 3282c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp break; 3283c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 32840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3285af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes != 1) 32867a287bfadeadea12e47c2376ca78a5d101687142cristy { 3287c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp status=SetImageProgress(image,LoadImageTag,pass,num_passes); 32887a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 32897a287bfadeadea12e47c2376ca78a5d101687142cristy break; 32907a287bfadeadea12e47c2376ca78a5d101687142cristy } 32913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 32930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 32943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* image->storage_class != DirectClass */ 3295c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 32963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 32973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 32983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Quantum 32993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_scanline; 33003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register Quantum 33023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *r; 33033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 33043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 33053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert grayscale image to PseudoClass pixel packets. 33063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 3307c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (logging != MagickFalse) 3308c17d96f447438bb27d874f1440ed05f6493fde1fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3309c17d96f447438bb27d874f1440ed05f6493fde1fglennrp " Converting grayscale pixels to pixel packets"); 331016ea139d53d867211d3bb0fa859a83de653f687ecristy 33118a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA ? 3312b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 33130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) AcquireQuantumMemory(image->columns, 3315b0a657e13c4aefba39c51292005427b47277869dcristy (image->alpha_trait == BlendPixelTrait? 2 : 1)* 3316b0a657e13c4aefba39c51292005427b47277869dcristy sizeof(*quantum_scanline)); 33170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (quantum_scanline == (Quantum *) NULL) 3319edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 33200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3321bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 33223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33234f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp Quantum 33244f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha; 33254f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (num_passes > 1) 3327faa852bad40107edae19405e76a299057668d795glennrp row_offset=ping_rowbytes*y; 3328c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 33293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 33303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy row_offset=0; 3331c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3332cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_read_row(ping,ping_pixels+row_offset,NULL); 3333c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 3334c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp if (pass < num_passes-1) 3335c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp continue; 3336c5c31be334ad2c5e7a99c4d3b1a28b330b26d4dcglennrp 33374f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp q=QueueAuthenticPixels(image,0,y,image->columns,1,exception); 33380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 333916ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 33403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 33410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3342cf002022280cc4dedb2748ad6f415aac1d44f530glennrp p=ping_pixels+row_offset; 33433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 3344c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3345faa852bad40107edae19405e76a299057668d795glennrp switch (ping_bit_depth) 33463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 8: 33483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 33494f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 3350faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 3351bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 33523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3353a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 33544f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33554f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha=ScaleCharToQuantum((unsigned char)*p++); 33564f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33574f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp SetPixelAlpha(image,alpha,q); 33584f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33594f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp if (alpha != OpaqueAlpha) 33600b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 33614f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 336216ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 33633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 33640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3366bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3367a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp *r++=*p++; 33680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 33693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 33703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 337147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 33723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy case 16: 33733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3374bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 3375a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp { 33769b034ff476914bd7bcc87f5b23755b1e1512b64dglennrp#if (MAGICKCORE_QUANTUM_DEPTH >= 16) 337787281ec8d96ad26dfed9968c29b2920cb3d96744cristy unsigned short 337858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum; 337958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 338058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (image->colors > 256) 3381c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 338258f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 338358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp else 3384c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 338558f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 338658f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp quantum|=(*p++); 3387c17d96f447438bb27d874f1440ed05f6493fde1fglennrp *r=ScaleShortToQuantum(quantum); 338858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp r++; 33890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3390faa852bad40107edae19405e76a299057668d795glennrp if (ping_color_type == 4) 33913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 3392c17d96f447438bb27d874f1440ed05f6493fde1fglennrp if (image->colors > 256) 3393c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=((*p++) << 8); 3394c17d96f447438bb27d874f1440ed05f6493fde1fglennrp else 3395c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum=0; 3396c17d96f447438bb27d874f1440ed05f6493fde1fglennrp 3397c17d96f447438bb27d874f1440ed05f6493fde1fglennrp quantum|=(*p++); 33984f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 33994f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp alpha=ScaleShortToQuantum(quantum); 34004f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp SetPixelAlpha(image,alpha,q); 34014f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 34024f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp if (alpha != OpaqueAlpha) 340358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp found_transparent_pixel = MagickTrue; 34044f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 340516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 340658f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp } 340758f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp 340858f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp#else /* MAGICKCORE_QUANTUM_DEPTH == 8 */ 340958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp *r++=(*p++); 341058f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; /* strip low byte */ 341147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 341258f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp if (ping_color_type == 4) 341358f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp { 341416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,*p++,q); 34154f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 341616ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 34170b206f5daa453dc1035db5890cabc899736dc2d0glennrp found_transparent_pixel = MagickTrue; 34184f99639dd26d0b38e2d421f3758b74c215e9cd4aglennrp 341958f77c7678f35e372fd218e4bb0b9cb8937daed7glennrp p++; 342016ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 34213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 3423a18d5bc7daf77f267862e1dfeee6fa0e5e2ea6e8glennrp } 342447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 342747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default: 34293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 34313faa9a3fb01696daaf976d595f492cb530bffb21glennrp 34323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 34333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Transfer image scanline. 34343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 34353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy r=quantum_scanline; 34360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 343716ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 343816ea139d53d867211d3bb0fa859a83de653f687ecristy 343916ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 344016ea139d53d867211d3bb0fa859a83de653f687ecristy break; 3441bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=0; x < (ssize_t) image->columns; x++) 344216ea139d53d867211d3bb0fa859a83de653f687ecristy { 344316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,*r++,q); 344416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 344516ea139d53d867211d3bb0fa859a83de653f687ecristy } 34460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 34473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 34483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3450af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes == 1) 34517a287bfadeadea12e47c2376ca78a5d101687142cristy { 3452cee9711bbc334b5677d5ec4ea1cc70340d35ee35cristy status=SetImageProgress(image,LoadImageTag,(MagickOffsetType) y, 34539fff7b4fa7d657da7bfed66239982b85c6337de9cristy image->rows); 345447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34557a287bfadeadea12e47c2376ca78a5d101687142cristy if (status == MagickFalse) 34567a287bfadeadea12e47c2376ca78a5d101687142cristy break; 34577a287bfadeadea12e47c2376ca78a5d101687142cristy } 34583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3459c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3460af9320404a7b05014476f844b11110157a21b73eglennrp if (num_passes != 1) 34613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 34623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImageTag,pass,num_passes); 346347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 34643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 34653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 34663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3467c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 34683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_scanline=(Quantum *) RelinquishMagickMemory(quantum_scanline); 34693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 3470c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3471b0a657e13c4aefba39c51292005427b47277869dcristy image->alpha_trait=found_transparent_pixel ? BlendPixelTrait : 3472b0a657e13c4aefba39c51292005427b47277869dcristy UndefinedPixelTrait; 3473c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 3474c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 3475c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 3476c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (found_transparent_pixel != MagickFalse) 3477c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3478c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Found transparent pixel"); 3479c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 34805aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 34815aa37f69df93407ddf94afdfd2504f708d8b3242glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 34825aa37f69df93407ddf94afdfd2504f708d8b3242glennrp " No transparent pixel was found"); 3483bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 34845aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type&=0x03; 34855aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 3486c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3487c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 3488c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 348916ea139d53d867211d3bb0fa859a83de653f687ecristy if (quantum_info != (QuantumInfo *) NULL) 349016ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info=DestroyQuantumInfo(quantum_info); 349116ea139d53d867211d3bb0fa859a83de653f687ecristy 34925c6f789db7a30bad01ace12b09ad9cd471339e94cristy if (image->storage_class == PseudoClass) 34935c6f789db7a30bad01ace12b09ad9cd471339e94cristy { 3494b0a657e13c4aefba39c51292005427b47277869dcristy PixelTrait 3495b0a657e13c4aefba39c51292005427b47277869dcristy alpha_trait; 34965c6f789db7a30bad01ace12b09ad9cd471339e94cristy 3497b0a657e13c4aefba39c51292005427b47277869dcristy alpha_trait=image->alpha_trait; 34988a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 349916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 3500b0a657e13c4aefba39c51292005427b47277869dcristy image->alpha_trait=alpha_trait; 35015c6f789db7a30bad01ace12b09ad9cd471339e94cristy } 350247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 35034eb3931feb349dd87142c78503b779228f3e1a0fglennrp png_read_end(ping,end_info); 35043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 3505ccc36af759d30fb50b1deda241d038402a393b17glennrp if (logging != MagickFalse) 3506ccc36af759d30fb50b1deda241d038402a393b17glennrp { 3507ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 3508ccc36af759d30fb50b1deda241d038402a393b17glennrp " image->storage_class=%d\n",(int) image->storage_class); 3509ccc36af759d30fb50b1deda241d038402a393b17glennrp } 3510ccc36af759d30fb50b1deda241d038402a393b17glennrp 35113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0 && mng_info->scenes_found-1 < 3512bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) image_info->first_scene && image->delay != 0) 35133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 35150997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 35163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 351716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 3518868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3519cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 35203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 35213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 35223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 35233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage() early."); 35243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 35253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 352647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3527faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 35283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 35293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ClassType 35303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class; 35313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 35323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 35333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image has a transparent background. 35343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 35353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy storage_class=image->storage_class; 35368a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 3537c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35383c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp/* Balfour fix from imagemagick discourse server, 5 Feb 2010 */ 3539c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (storage_class == PseudoClass) 35410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 3543c11cf6a442f3046940608a5743a68cc891deb13eglennrp { 35440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < ping_num_trans; x++) 35450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35468a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->colormap[x].alpha_trait=BlendPixelTrait; 354716ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = 354816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleCharToQuantum((unsigned char)ping_trans_alpha[x]); 35490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3550c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 355147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 35520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY) 35530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=0; x < (int) image->colors; x++) 35550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ScaleQuantumToShort(image->colormap[x].red) == 355716ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.alpha) 35580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35598a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->colormap[x].alpha_trait=BlendPixelTrait; 356016ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[x].alpha = (Quantum) TransparentAlpha; 35610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 35620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 35630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 356416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 35650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 356647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3567a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if 1 /* Should have already been done above, but glennrp problem P10 3568a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * needs this. 3569a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 35700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 35710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (y=0; y < (ssize_t) image->rows; y++) 35730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 35740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->storage_class=storage_class; 35750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 3576c11cf6a442f3046940608a5743a68cc891deb13eglennrp 357716ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 35780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3579c11cf6a442f3046940608a5743a68cc891deb13eglennrp 35800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3581a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp /* Caution: on a Q8 build, this does not distinguish between 3582a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp * 16-bit colors that differ only in the low byte 3583a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp */ 35840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (x=(ssize_t) image->columns-1; x >= 0; x--) 35850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 358616ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToShort(GetPixelRed(image,q)) == 358716ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.red && 358816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelGreen(image,q)) == 358916ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.green && 359016ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToShort(GetPixelBlue(image,q)) == 359116ea139d53d867211d3bb0fa859a83de653f687ecristy transparent_color.blue) 35924f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 359316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,q); 35944f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 35950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 359667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if 0 /* I have not found a case where this is needed. */ 35970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 35984f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 359916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,q)=(Quantum) OpaqueAlpha; 36004f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 3601a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 36020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 360316ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 36040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 36050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 36070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp break; 3608c11cf6a442f3046940608a5743a68cc891deb13eglennrp } 36090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 3610a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 3611c11cf6a442f3046940608a5743a68cc891deb13eglennrp 36123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->storage_class=DirectClass; 36133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36143c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 3615eb3b22a03f31af7f724573d8537cd91fca06ee41cristy for (j = 0; j < 2; j++) 36164eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36174eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (j == 0) 3618a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,ping_info,&text,&num_text) != 0 ? 3619a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 36204eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 3621a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp status = png_get_text(ping,end_info,&text,&num_text) != 0 ? 3622a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp MagickTrue : MagickFalse; 36233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36244eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (status != MagickFalse) 36254eb3931feb349dd87142c78503b779228f3e1a0fglennrp for (i=0; i < (ssize_t) num_text; i++) 36264eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36274eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Check for a profile */ 36280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36294eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 36304eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 36314eb3931feb349dd87142c78503b779228f3e1a0fglennrp " Reading PNG text chunk"); 36320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36335285ae1de367013bf70a5a4e5feaefe3de8dda7bglennrp if (strlen(text[i].key) > 16 && 36346dfc26699a1aacdec9771115c4dcaf6c5c0a8f98glennrp memcmp(text[i].key, "Raw profile type ",17) == 0) 36354eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 363699f968111025b4fadb966ca482c6f57750bf007bglennrp const char 363799f968111025b4fadb966ca482c6f57750bf007bglennrp *value; 363899f968111025b4fadb966ca482c6f57750bf007bglennrp 363999f968111025b4fadb966ca482c6f57750bf007bglennrp value=GetImageOption(image_info,"profile:skip"); 364099f968111025b4fadb966ca482c6f57750bf007bglennrp 364199f968111025b4fadb966ca482c6f57750bf007bglennrp if (IsOptionMember(text[i].key+17,value) == MagickFalse) 364299f968111025b4fadb966ca482c6f57750bf007bglennrp { 364399f968111025b4fadb966ca482c6f57750bf007bglennrp (void) Magick_png_read_raw_profile(ping,image,image_info,text, 364499f968111025b4fadb966ca482c6f57750bf007bglennrp (int) i,exception); 364599f968111025b4fadb966ca482c6f57750bf007bglennrp num_raw_profiles++; 364699f968111025b4fadb966ca482c6f57750bf007bglennrp if (logging != MagickFalse) 364799f968111025b4fadb966ca482c6f57750bf007bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 364899f968111025b4fadb966ca482c6f57750bf007bglennrp " Read raw profile %s",text[i].key+17); 364999f968111025b4fadb966ca482c6f57750bf007bglennrp } 365099f968111025b4fadb966ca482c6f57750bf007bglennrp else 365199f968111025b4fadb966ca482c6f57750bf007bglennrp { 365299f968111025b4fadb966ca482c6f57750bf007bglennrp if (logging != MagickFalse) 365399f968111025b4fadb966ca482c6f57750bf007bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 365499f968111025b4fadb966ca482c6f57750bf007bglennrp " Skipping raw profile %s",text[i].key+17); 365599f968111025b4fadb966ca482c6f57750bf007bglennrp } 36564eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36574eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36584eb3931feb349dd87142c78503b779228f3e1a0fglennrp else 36594eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 36604eb3931feb349dd87142c78503b779228f3e1a0fglennrp char 36614eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value; 36624eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36634eb3931feb349dd87142c78503b779228f3e1a0fglennrp length=text[i].text_length; 3664151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy value=(char *) AcquireQuantumMemory(length+MagickPathExtent, 36654eb3931feb349dd87142c78503b779228f3e1a0fglennrp sizeof(*value)); 36664eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (value == (char *) NULL) 36674eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3668edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 36694eb3931feb349dd87142c78503b779228f3e1a0fglennrp break; 36704eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 36714eb3931feb349dd87142c78503b779228f3e1a0fglennrp *value='\0'; 36724eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) ConcatenateMagickString(value,text[i].text,length+2); 36734eb3931feb349dd87142c78503b779228f3e1a0fglennrp 36744eb3931feb349dd87142c78503b779228f3e1a0fglennrp /* Don't save "density" or "units" property if we have a pHYs 36754eb3931feb349dd87142c78503b779228f3e1a0fglennrp * chunk 36764eb3931feb349dd87142c78503b779228f3e1a0fglennrp */ 36774eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (!png_get_valid(ping,ping_info,PNG_INFO_pHYs) || 36784eb3931feb349dd87142c78503b779228f3e1a0fglennrp (LocaleCompare(text[i].key,"density") != 0 && 36794eb3931feb349dd87142c78503b779228f3e1a0fglennrp LocaleCompare(text[i].key,"units") != 0)) 368016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,text[i].key,value,exception); 36813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 36824eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (logging != MagickFalse) 36833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 36844eb3931feb349dd87142c78503b779228f3e1a0fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 36852dd1906783a5ece58a6105b4f59239e28b13caddglennrp " length: %lu\n" 36862dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Keyword: %s", 36872dd1906783a5ece58a6105b4f59239e28b13caddglennrp (unsigned long) length, 36882dd1906783a5ece58a6105b4f59239e28b13caddglennrp text[i].key); 36893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 36900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 36914eb3931feb349dd87142c78503b779228f3e1a0fglennrp value=DestroyString(value); 369297f90e23c85b9c58387880125c29d8c99126f83aglennrp } 36934eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 3694fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk num_text_total += num_text; 3695fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 36963c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 36973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 36983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 36993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Store the object if necessary. 37003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id && !mng_info->frozen[object_id]) 37023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 37043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy create a new object buffer. 37073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]=(MngBuffer *) 370973bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(MngBuffer)); 37100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] != (MngBuffer *) NULL) 37123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=(Image *) NULL; 37143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->reference_count=1; 37153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 371747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->ob[object_id] == (MngBuffer *) NULL) || 37193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->frozen) 37203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id] == (MngBuffer *) NULL) 3722edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation failed"); 37230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->frozen) 3725edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Cannot overwrite frozen MNG object buffer"); 37263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 37293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 37323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=DestroyImage 37333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->ob[object_id]->image); 37340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image=CloneImage(image,0,0,MagickTrue, 373616ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 37370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[object_id]->image != (Image *) NULL) 37393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->image->file=(FILE *) NULL; 37400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 37413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 3742edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cloning image for object buffer failed"); 37430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3744faa852bad40107edae19405e76a299057668d795glennrp if (ping_width > 250000L || ping_height > 250000L) 37453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_error(ping,"PNG Image dimensions are too large."); 37460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3747faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->width=ping_width; 3748faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->height=ping_height; 3749faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->color_type=ping_color_type; 3750faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->sample_depth=ping_bit_depth; 3751faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->interlace_method=ping_interlace_method; 3752faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->compression_method= 3753faa852bad40107edae19405e76a299057668d795glennrp ping_compression_method; 3754faa852bad40107edae19405e76a299057668d795glennrp mng_info->ob[object_id]->filter_method=ping_filter_method; 37550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3756faa852bad40107edae19405e76a299057668d795glennrp if (png_get_valid(ping,ping_info,PNG_INFO_PLTE)) 37573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_colorp 37593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy plte; 37603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 37613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 37623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Copy the PLTE to the object buffer. 37633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 37643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_get_PLTE(ping,ping_info,&plte,&number_colors); 37653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=number_colors; 37663c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 37673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < number_colors; i++) 37683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 37693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte[i]=plte[i]; 37703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 377247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 37733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 37743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[object_id]->plte_length=0; 37753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 37773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 37780a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 37798a46d827a124555f0c48fb2368ec1bba8e079ab6cristy /* Set image->alpha_trait to MagickTrue if the input colortype supports 37800a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * alpha or if a valid tRNS chunk is present, no matter whether there 37810a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp * is actual transparency present. 37820a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp */ 37838a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=(((int) ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) || 37840a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp ((int) ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) || 37850a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp (png_get_valid(ping,ping_info,PNG_INFO_tRNS))) ? 3786b0a657e13c4aefba39c51292005427b47277869dcristy BlendPixelTrait : UndefinedPixelTrait; 37870a55b4c577b5e63eca6f108dea6f5c42191f78acglennrp 3788224ad8d90905c1c81d949c30e4a808246b4d5165glennrp#if 0 /* I'm not sure what's wrong here but it does not work. */ 378917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 37905830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 37915830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 3792def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,GrayscaleAlphaType,exception); 37935830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37945830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 3795def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,PaletteAlphaType,exception); 37965830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 37975830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 3798def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 37995830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 38005830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 38015830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 38025830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 38035830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 38045830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,GrayscaleType,exception); 38055830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 38065830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 38075830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,PaletteType,exception); 38085830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 38095830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp else 38105830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) SetImageType(image,TrueColorType,exception); 38115830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 3812224ad8d90905c1c81d949c30e4a808246b4d5165glennrp#endif 38135830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 3814cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* Set more properties for identify to retrieve */ 3815cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3816cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp char 3817151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy msg[MagickPathExtent]; 3818cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38194eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (num_text_total != 0) 3820cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3821cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp /* libpng doesn't tell us whether they were tEXt, zTXt, or iTXt */ 3822151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 3823613276d97a7f0e40c1055f9ff5ddfcfa8896e20bglennrp "%d tEXt/zTXt/iTXt chunks were found", num_text_total); 38243398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:text",msg, 382516ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3826cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3827cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3828cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (num_raw_profiles != 0) 3829cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp { 3830151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 3831cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp "%d were found", num_raw_profiles); 383216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(image,"png:text-encoded profiles",msg, 383316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 3834cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3835cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 383698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_cHRM != MagickFalse) 38375961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 3838151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38395961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Chromaticity, above)"); 38403398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:cHRM",msg, 384116ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38425961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 3843cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 3844cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_bKGD)) 38455961225e531a5f26ae179c1d919582d5cdaa44bbglennrp { 3846151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38475961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found (see Background color, above)"); 38483398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:bKGD",msg, 384916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38505961225e531a5f26ae179c1d919582d5cdaa44bbglennrp } 38515961225e531a5f26ae179c1d919582d5cdaa44bbglennrp 3852151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"%s", 38535961225e531a5f26ae179c1d919582d5cdaa44bbglennrp "chunk was found"); 3854cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 385598b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp#if defined(PNG_iCCP_SUPPORTED) 385698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_iCCP != MagickFalse) 38573398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:iCCP",msg, 385816ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 385998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp#endif 3860cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38614eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_tRNS)) 38623398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:tRNS",msg, 386316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38644eb3931feb349dd87142c78503b779228f3e1a0fglennrp 38654eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_sRGB_SUPPORTED) 386698b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_sRGB != MagickFalse) 38674eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3868151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 386998b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp "intent=%d (%s)", 387098b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp (int) intent, 387198b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp Magick_RenderingIntentString_from_PNG_RenderingIntent(intent)); 38723398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:sRGB",msg, 387398b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp exception); 38744eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 38754eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 38764eb3931feb349dd87142c78503b779228f3e1a0fglennrp 387798b83d44ee0acdfb9854edd714e4f2f4f0f787e4glennrp if (ping_found_gAMA != MagickFalse) 38784eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3879151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 388016ea139d53d867211d3bb0fa859a83de653f687ecristy "gamma=%.8g (See Gamma, above)", 388116ea139d53d867211d3bb0fa859a83de653f687ecristy file_gamma); 38823398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:gAMA",msg, 388316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38844eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 3885cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38864eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_pHYs_SUPPORTED) 3887cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp if (png_get_valid(ping,ping_info,PNG_INFO_pHYs)) 38884eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3889151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 389007523c7d2e40370804c2036295571e4b6426f94dglennrp "x_res=%.10g, y_res=%.10g, units=%d", 38914eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) x_resolution,(double) y_resolution, unit_type); 38923398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:pHYs",msg, 389316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 38944eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 38954eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 3896cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 38974eb3931feb349dd87142c78503b779228f3e1a0fglennrp#if defined(PNG_oFFs_SUPPORTED) 38984eb3931feb349dd87142c78503b779228f3e1a0fglennrp if (png_get_valid(ping,ping_info,PNG_INFO_oFFs)) 38994eb3931feb349dd87142c78503b779228f3e1a0fglennrp { 3900151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent,"x_off=%.20g, y_off=%.20g", 39014eb3931feb349dd87142c78503b779228f3e1a0fglennrp (double) image->page.x,(double) image->page.y); 39023398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:oFFs",msg, 390316ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 39044eb3931feb349dd87142c78503b779228f3e1a0fglennrp } 39054eb3931feb349dd87142c78503b779228f3e1a0fglennrp#endif 39064eb3931feb349dd87142c78503b779228f3e1a0fglennrp 3907fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 3908fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk read_tIME_chunk(image,ping,end_info,exception); 3909fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 3910fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 391107523c7d2e40370804c2036295571e4b6426f94dglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 391207523c7d2e40370804c2036295571e4b6426f94dglennrp (image->page.height != 0 && image->page.height != image->rows)) 391307523c7d2e40370804c2036295571e4b6426f94dglennrp { 3914151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(msg,MagickPathExtent, 391507523c7d2e40370804c2036295571e4b6426f94dglennrp "width=%.20g, height=%.20g", 391607523c7d2e40370804c2036295571e4b6426f94dglennrp (double) image->page.width,(double) image->page.height); 39173398b5b62521b49754d9391aae9e4511857bd63bglennrp (void) SetImageProperty(image,"png:vpAg",msg, 391816ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 391907523c7d2e40370804c2036295571e4b6426f94dglennrp } 3920cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp } 3921cb395ac9c5c50c2829a9988f95fd8aea7af82c00glennrp 39223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 39243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_read_struct(&ping,&ping_info,&end_info); 39263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39270997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 39283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 39303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 39313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOnePNGImage()"); 39320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 3933868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 3934edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 3935edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 3936edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 3937edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block, revert to 3938edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 3939edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 3940edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 39413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 39423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* end of reading one PNG image */ 39443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 39453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39463ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 39473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 39483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 3949919429921a43880a338ed87e128d3b96219442efglennrp *image; 39503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 395221f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 395321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 39543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 39553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 39573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 39583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 3960151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 39613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ssize_t 39633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 39643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 39653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 39673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 3969e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 397047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->debug != MagickFalse) 39723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s", 39733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 397447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 3976e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 3977fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadPNGImage()"); 397816ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 39793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 39803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 398147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 39833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(FileOpenError,"UnableToOpenFile"); 398447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Verify PNG signature. 39873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=ReadBlob(image,8,(unsigned char *) magic_number); 398947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 3990dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp if (count < 8 || memcmp(magic_number,"\211PNG\r\n\032\n",8) != 0) 39913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 399247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 39943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 39953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 39963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 399773bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 399847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 39993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 40003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 400147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 40033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 40043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 40053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 40063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 40073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 40083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 40103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 401147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 40133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error"); 40170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 40193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 402047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 402247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 40233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->columns == 0) || (image->rows == 0)) 40243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 40253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 40263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 40273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadPNGImage() with error."); 40280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 40303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 403147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 403272715f5c299a6482f8eb175070b056d77b74a43fcristy if ((IssRGBColorspace(image->colorspace) != MagickFalse) && 40333d627862fb79aad8a20be4f1587f0b8761db441aglennrp ((image->gamma < .45) || (image->gamma > .46)) && 40343d627862fb79aad8a20be4f1587f0b8761db441aglennrp !(image->chromaticity.red_primary.x>0.6399f && 40353d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.x<0.6401f && 40363d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y>0.3299f && 40373d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.red_primary.y<0.3301f && 40383d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x>0.2999f && 40393d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.x<0.3001f && 40403d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y>0.5999f && 40413d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.green_primary.y<0.6001f && 40423d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x>0.1499f && 40433d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.x<0.1501f && 40443d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y>0.0599f && 40453d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.blue_primary.y<0.0601f && 40463d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x>0.3126f && 40473d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.x<0.3128f && 40483d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y>0.3289f && 40493d627862fb79aad8a20be4f1587f0b8761db441aglennrp image->chromaticity.white_point.y<0.3291f)) 4050ccc36af759d30fb50b1deda241d038402a393b17glennrp { 4051ccc36af759d30fb50b1deda241d038402a393b17glennrp SetImageColorspace(image,RGBColorspace,exception); 4052ccc36af759d30fb50b1deda241d038402a393b17glennrp } 405372715f5c299a6482f8eb175070b056d77b74a43fcristy 40543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 4055ccc36af759d30fb50b1deda241d038402a393b17glennrp { 4056ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4057ccc36af759d30fb50b1deda241d038402a393b17glennrp " page.w: %.20g, page.h: %.20g,page.x: %.20g, page.y: %.20g.", 4058ccc36af759d30fb50b1deda241d038402a393b17glennrp (double) image->page.width,(double) image->page.height, 4059ccc36af759d30fb50b1deda241d038402a393b17glennrp (double) image->page.x,(double) image->page.y); 4060ccc36af759d30fb50b1deda241d038402a393b17glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4061ccc36af759d30fb50b1deda241d038402a393b17glennrp " image->colorspace: %d", (int) image->colorspace); 4062ccc36af759d30fb50b1deda241d038402a393b17glennrp } 406397f90e23c85b9c58387880125c29d8c99126f83aglennrp 406497f90e23c85b9c58387880125c29d8c99126f83aglennrp if (logging != MagickFalse) 40653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadPNGImage()"); 40660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 40673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 40683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 40693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 40723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 40733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 40743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d O n e J N G I m a g e % 40793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 40823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 40833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadOneJNGImage() reads a JPEG Network Graphics (JNG) image file 40853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (minus the 8-byte signature) and returns it. It allocates the memory 40863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 40873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 40883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 40903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadOneJNGImage method is: 40923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadOneJNGImage(MngInfo *mng_info, const ImageInfo *image_info, 40943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ExceptionInfo *exception) 40953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 40973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 40983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o mng_info: Specifies a pointer to a MngInfo structure. 40993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 41003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 41013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 41023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 41033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 41043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 41053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadOneJNGImage(MngInfo *mng_info, 41063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const ImageInfo *image_info, ExceptionInfo *exception) 41073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 41083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 41093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image, 41103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image, 41113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *image, 41123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jng_image; 41133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 41153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *alpha_image_info, 41163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *color_image_info; 41173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41184383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 41194383ec8c3c8811128f5a8a034d67c47db5e7e75acristy logging; 41204383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 4121bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 41223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 41233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 41253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 41263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 41283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height, 41293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width; 41303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 41323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 41333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth, 41343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method, 41353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method, 41363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 41373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 41383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method, 41393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method; 41403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 414116ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 41423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *s; 41433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4144bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 41453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 41463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 41473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 414816ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 41493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 41503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 41523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 41533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 41553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP, 4156e0421fec74bee9a6f9def3d51aed4204f970ad73glennrp reading_idat; 41573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4158bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 41593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 41603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=0; 41623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 41633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=0; 41643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_height=0; 41653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_width=0; 41663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=(Image *) NULL; 41673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=(Image *) NULL; 41683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) NULL; 41693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=(ImageInfo *) NULL; 41703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 4172fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter ReadOneJNGImage()"); 41733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 41750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 417616ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 41773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 41783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 41803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 41823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 41833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " AcquireNextImage()"); 41840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 418516ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 41860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 41883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 41890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 41903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 41913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 41923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 41933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 41953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Signature bytes have already been read. 41963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 41973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 41983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickFalse; 41993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickFalse; 42003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (;;) 42013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4203151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy type[MagickPathExtent]; 42043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 42063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 42073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 42093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 42103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 42123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new JNG chunk. 42133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 42143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 42153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 42160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 42183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 42190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 4221151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(type,"errr",MagickPathExtent); 42223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 42233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(unsigned int) ReadBlob(image,4,(unsigned char *) type); 42243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 4227e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading JNG chunk type %c%c%c%c, length: %.20g", 4228e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 42293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX || count == 0) 42316af512ae5eeeed8effd9af4d57aab7caf74c65eddirk ThrowReaderException(CorruptImageError,"CorruptImage"); 42320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 42343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 423547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42368fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 42373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 42390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 42413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 42420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4243bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 42443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 42450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 42463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 42473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 424847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 42503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 42513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 42523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 16) 42543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4255bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 4256e2440c250d94d64f8c70e596fe90808795aaa07ecristy (p[2] << 8) | p[3]); 4257bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy jng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 4258e2440c250d94d64f8c70e596fe90808795aaa07ecristy (p[6] << 8) | p[7]); 4259e2440c250d94d64f8c70e596fe90808795aaa07ecristy if ((jng_width == 0) || (jng_height == 0)) 4260e2440c250d94d64f8c70e596fe90808795aaa07ecristy ThrowReaderException(CorruptImageError,"NegativeOrZeroImageSize"); 42613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=p[8]; 42623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_sample_depth=p[9]; 42633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method=p[10]; 42643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_interlace_method=p[11]; 426547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->interlace=jng_image_interlace_method != 0 ? PNGInterlace : 42673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy NoInterlace; 426847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=p[12]; 42703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method=p[13]; 42713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_filter_method=p[14]; 42723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method=p[15]; 427347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 42753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 42763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42772dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_width: %16lu, jng_height: %16lu\n" 42782dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_color_type: %16d, jng_image_sample_depth: %3d\n" 42793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_image_compression_method:%3d", 42802dd1906783a5ece58a6105b4f59239e28b13caddglennrp (unsigned long) jng_width, (unsigned long) jng_height, 42812dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_color_type, jng_image_sample_depth, 42823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image_compression_method); 428347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42852dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_image_interlace_method: %3d" 42863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_sample_depth: %3d", 42872dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_image_interlace_method, 42883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth); 428947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 42903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 42912dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_alpha_compression_method:%3d\n" 42922dd1906783a5ece58a6105b4f59239e28b13caddglennrp " jng_alpha_filter_method: %3d\n" 42933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " jng_alpha_interlace_method: %3d", 42942dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_alpha_compression_method, 42952dd1906783a5ece58a6105b4f59239e28b13caddglennrp jng_alpha_filter_method, 42963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_interlace_method); 42973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 42983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 429947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43008fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 43013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 430247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 43043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((reading_idat == MagickFalse) && (read_JSEP == MagickFalse) && 43083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((memcmp(type,mng_JDAT,4) == 0) || (memcmp(type,mng_JdAA,4) == 0) || 43093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (memcmp(type,mng_IDAT,4) == 0) || (memcmp(type,mng_JDAA,4) == 0))) 43103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 43123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o create color_image 43133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o open color_blob, attached to color_image 43143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color type has alpha) 43153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy open alpha_blob, attached to alpha_image 43163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 43173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 431873bd4a51b419e914565bdf204bf1540dc4c8ee26cristy color_image_info=(ImageInfo *)AcquireMagickMemory(sizeof(ImageInfo)); 431947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image_info == (ImageInfo *) NULL) 43213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 432247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 43233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(color_image_info); 432416ea139d53d867211d3bb0fa859a83de653f687ecristy color_image=AcquireImage(color_image_info,exception); 43250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (color_image == (Image *) NULL) 43273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 43283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating color_blob."); 43320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(color_image->filename); 43343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(color_image_info,color_image,WriteBinaryBlobMode, 43353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 43360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 43383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 43393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_info->ping == MagickFalse) && (jng_color_type >= 12)) 43413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=(ImageInfo *) 434373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy AcquireMagickMemory(sizeof(ImageInfo)); 43440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image_info == (ImageInfo *) NULL) 43463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 43470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageInfo(alpha_image_info); 434916ea139d53d867211d3bb0fa859a83de653f687ecristy alpha_image=AcquireImage(alpha_image_info,exception); 43500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (alpha_image == (Image *) NULL) 43523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 43543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 43553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 43563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating alpha_blob."); 43610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(alpha_image->filename); 43633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(alpha_image_info,alpha_image,WriteBinaryBlobMode, 43643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 43650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 43673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 43680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 43703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 43713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 43723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[18]; 43733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 43753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 43763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing IHDR chunk to alpha_blob."); 43770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,8,(const unsigned char *) 43793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "\211PNG\r\n\032\n"); 43800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 43813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,13L); 43823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IHDR); 438303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IHDR,13L); 43843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+4,jng_width); 43853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(data+8,jng_height); 43863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[12]=jng_alpha_sample_depth; 43873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[13]=0; /* color_type gray */ 43883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[14]=0; /* compression method 0 */ 43893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[15]=0; /* filter_method 0 */ 43903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[16]=0; /* interlace_method 0 */ 43913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,17,data); 43923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,17)); 43933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy reading_idat=MagickTrue; 43963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 43973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 43983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JDAT,4) == 0) 43993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 440047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk to color_image->blob */ 44013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAT chunk data to color_blob."); 44053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(color_image,length,chunk); 440747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 44088fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 441047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 44113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IDAT,4) == 0) 44153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 44173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 44183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 441947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy IDAT header and chunk data to alpha_image->blob */ 44203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4421889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (alpha_image != NULL && image_info->ping == MagickFalse) 44223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying IDAT chunk data to alpha_blob."); 44263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4427bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(alpha_image,(size_t) length); 44283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IDAT); 442903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IDAT,length); 44303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 44313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 44323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image, 44333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crc32(crc32(0,data,4),chunk,(uInt) length)); 44343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44368fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_JDAA,4) == 0) || (memcmp(type,mng_JdAA,4) == 0)) 44433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 444447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Copy chunk data to alpha_image->blob */ 44453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4446889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (alpha_image != NULL && image_info->ping == MagickFalse) 44473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 44493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 44503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying JDAA chunk data to alpha_blob."); 44513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,length,chunk); 44533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44558fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JSEP,4) == 0) 44623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read_JSEP=MagickTrue; 44640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44658fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 44663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 44723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 2) 44743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 44763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=image->background_color.red; 44773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=image->background_color.red; 44783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 6) 44813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.red=ScaleCharToQuantum(p[1]); 44833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.green=ScaleCharToQuantum(p[3]); 44843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color.blue=ScaleCharToQuantum(p[5]); 44853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 44913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 44923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 44933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 44948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->gamma=((float) mng_get_long(p))*0.00001; 44950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 44963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 44973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 44983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 44993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 45013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 45033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45048182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.x=0.00001*mng_get_long(p); 45058182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.white_point.y=0.00001*mng_get_long(&p[4]); 45068182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.x=0.00001*mng_get_long(&p[8]); 45078182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.red_primary.y=0.00001*mng_get_long(&p[12]); 45088182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.x=0.00001*mng_get_long(&p[16]); 45098182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.green_primary.y=0.00001*mng_get_long(&p[20]); 45108182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.x=0.00001*mng_get_long(&p[24]); 45118182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image->chromaticity.blue_primary.y=0.00001*mng_get_long(&p[28]); 45123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 451347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 45193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 1) 45213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4522e610a071534e448c46460a5aa39ede33bf56b329glennrp image->rendering_intent= 4523cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 4524da7803d6b1161960bc1e7db4d9718284c116fab8cristy image->gamma=1.000f/2.200f; 45253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.x=0.6400f; 45263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.red_primary.y=0.3300f; 45273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.x=0.3000f; 45283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.green_primary.y=0.6000f; 45293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.x=0.1500f; 45303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.blue_primary.y=0.0600f; 45313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.x=0.3127f; 45323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->chromaticity.white_point.y=0.3290f; 45333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 453447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_oFFs,4) == 0) 45403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 45423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45435eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.x=(ssize_t) mng_get_long(p); 45445eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp image->page.y=(ssize_t) mng_get_long(&p[4]); 45450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] != 0) 45473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x/=10000; 45493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y/=10000; 45503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 455247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 45538fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 45603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 45623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 456316ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=(double) mng_get_long(p); 456416ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=(double) mng_get_long(&p[4]); 45653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) p[8] == PNG_RESOLUTION_METER) 45663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 45673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->units=PixelsPerCentimeterResolution; 456816ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.x=image->resolution.x/100.0f; 456916ea139d53d867211d3bb0fa859a83de653f687ecristy image->resolution.y=image->resolution.y/100.0f; 45703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if 0 45783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 45793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 4580fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 45818fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 45873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45888fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 45893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 45903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4)) 45923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 45930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 45943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 45953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 45963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 45983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* IEND found */ 45993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 46013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Finish up reading image data: 46023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o read main image from color_blob. 46043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close color_blob. 46063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o if (color_type has alpha) 46083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is PNG 46093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadPNG 46103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if alpha_encoding is JPEG 46113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy read secondary image from alpha_blob via ReadJPEG 46123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o close alpha_blob. 46143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o copy intensity of secondary image into 461616ea139d53d867211d3bb0fa859a83de653f687ecristy alpha samples of main image. 46173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy o destroy the secondary image. 46193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 46203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4621325657913840de53be706fb11ec48ba11b53e808Cristy if (color_image_info == (ImageInfo *) NULL) 4622325657913840de53be706fb11ec48ba11b53e808Cristy { 4623325657913840de53be706fb11ec48ba11b53e808Cristy assert(color_image == (Image *) NULL); 4624325657913840de53be706fb11ec48ba11b53e808Cristy assert(alpha_image == (Image *) NULL); 4625325657913840de53be706fb11ec48ba11b53e808Cristy return((Image *) NULL); 4626325657913840de53be706fb11ec48ba11b53e808Cristy } 4627325657913840de53be706fb11ec48ba11b53e808Cristy 4628325657913840de53be706fb11ec48ba11b53e808Cristy if (color_image == (Image *) NULL) 4629325657913840de53be706fb11ec48ba11b53e808Cristy { 4630325657913840de53be706fb11ec48ba11b53e808Cristy assert(alpha_image == (Image *) NULL); 4631325657913840de53be706fb11ec48ba11b53e808Cristy return((Image *) NULL); 4632325657913840de53be706fb11ec48ba11b53e808Cristy } 4633325657913840de53be706fb11ec48ba11b53e808Cristy 4634325657913840de53be706fb11ec48ba11b53e808Cristy (void) SeekBlob(color_image,0,SEEK_SET); 4635325657913840de53be706fb11ec48ba11b53e808Cristy 46363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Reading jng_image from color_blob."); 46390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 4640f0eec7524321f1be1bfe568a13ab7d4d0333c814cristy assert(color_image_info != (ImageInfo *) NULL); 4641151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(color_image_info->filename,MagickPathExtent,"%s", 46423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image->filename); 46430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info->ping=MagickFalse; /* To do: avoid this */ 46453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(color_image_info,exception); 46460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(color_image->filename); 46483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image=DestroyImage(color_image); 46493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy color_image_info=DestroyImageInfo(color_image_info); 46503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image == (Image *) NULL) 46523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 46533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 46543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 46553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 46563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Copying jng_image pixels to main image."); 46570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=jng_height; 46593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=jng_width; 46600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46618320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy status=SetImageExtent(image,image->columns,image->rows,exception); 46628320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy if (status == MagickFalse) 46638320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy return(DestroyImageList(image)); 46648320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy 4665bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 46663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 466716ea139d53d867211d3bb0fa859a83de653f687ecristy s=GetVirtualPixels(jng_image,0,y,image->columns,1,exception); 46683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 466916ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 467016ea139d53d867211d3bb0fa859a83de653f687ecristy { 467116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(jng_image,s),q); 467216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(jng_image,s),q); 467316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(jng_image,s),q); 467416ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 467516ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 467616ea139d53d867211d3bb0fa859a83de653f687ecristy } 467747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 46783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 46793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 46803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 46830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 46853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type >= 12) 46873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method == 0) 46893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 46903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_byte 46913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data[5]; 46923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,0x00000000L); 46933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(data,mng_IEND); 469403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0L); 46953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(alpha_image,4,data); 46963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(alpha_image,crc32(0,data,4)); 46973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 46980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 46993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(alpha_image); 47000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 47023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 470316ea139d53d867211d3bb0fa859a83de653f687ecristy " Reading alpha from alpha_blob."); 47043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4705151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(alpha_image_info->filename,MagickPathExtent, 47063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",alpha_image->filename); 47073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=ReadImage(alpha_image_info,exception); 47090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 4711bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 47123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s=GetVirtualPixels(jng_image,0,y,image->columns,1, 471416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 47153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 471647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 471717f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 471816ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 471916ea139d53d867211d3bb0fa859a83de653f687ecristy { 472016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 472116ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 472216ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 472316ea139d53d867211d3bb0fa859a83de653f687ecristy } 47240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 472616ea139d53d867211d3bb0fa859a83de653f687ecristy for (x=(ssize_t) image->columns; x != 0; x--) 47273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 472816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelRed(jng_image,s),q); 472916ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != OpaqueAlpha) 47308a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=BlendPixelTrait; 473116ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 473216ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(jng_image); 47333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 47363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 47373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(alpha_image->filename); 47393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image=DestroyImage(alpha_image); 47403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy alpha_image_info=DestroyImageInfo(alpha_image_info); 47413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_image != (Image *) NULL) 47423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_image=DestroyImage(jng_image); 47433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 474647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read the JNG image. */ 474747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 47483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->mng_type == 0) 47493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 47503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_width=jng_width; 47513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_height=jng_height; 47523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 47530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.width == 0 && image->page.height == 0) 47550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.width=jng_width; 47570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.height=jng_height; 47580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->page.x == 0 && image->page.y == 0) 47610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.x=mng_info->x_off[mng_info->object_id]; 47630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 47640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 47670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 47680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp image->page.y=mng_info->y_off[mng_info->object_id]; 47690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 47700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 47723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,2*TellBlob(image), 47733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 2*GetBlobSize(image)); 47740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 477544c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 477644c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp return((Image *) NULL); 477744c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 47783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 47793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 47803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit ReadOneJNGImage()"); 47810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 47823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 47833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 47843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 47853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 47863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 47873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e a d J N G I m a g e % 47913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 47943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 47953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 47963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ReadJNGImage() reads a JPEG Network Graphics (JNG) image file 47973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (including the 8-byte signature) and returns it. It allocates the memory 47983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% necessary for the new Image structure and returns a pointer to the new 47993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image. 48003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 48023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the ReadJNGImage method is: 48043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image *ReadJNGImage(const ImageInfo *image_info, ExceptionInfo 48063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% *exception) 48073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 48093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 48113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o exception: return any errors or warnings in this structure. 48133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 48143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 48153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48163ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadJNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 48173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 48183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 48197ee973a2149db53911459cbf26f28eccdbc99efbglennrp *image; 48203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 482221f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 482321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 48243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 48253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 48273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 48283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4830151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 48313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 48333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 48343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 48363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 48373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 48383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 4839e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 48403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 48413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 4842e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 4843fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadJNGImage()"); 484416ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 48453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 48463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 48470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 48493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 48500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"JNG") != 0) 48523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 48530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 485447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify JNG signature. */ 485547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 485747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48583b8763efd02f5343a141d40636f6a8dfdc2c7682glennrp if (count < 8 || memcmp(magic_number,"\213JNG\r\n\032\n",8) != 0) 48593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 48600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 486147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 486247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 486473bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(*mng_info)); 48650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 48673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 48680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 486947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 487047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 48723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 48733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 48743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 48753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 48763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 48770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 48793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 48823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 48830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 48853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 488747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 48883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 48893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 48903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 48923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "exit ReadJNGImage() with error"); 48930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 48953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 48960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 48973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 48983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadJNGImage()"); 48990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 49003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(image); 49013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 49023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 49053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 49063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 4907151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy page_geometry[MagickPathExtent]; 49083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 4910889a928b732161b6353bd880e5ea0802f184c6d4glennrp *image; 49113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49124383ec8c3c8811128f5a8a034d67c47db5e7e75acristy MagickBooleanType 491321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 491421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure; 49154383ec8c3c8811128f5a8a034d67c47db5e7e75acristy 49163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 49173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object, 49183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id, 49193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found, 49203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend; 49213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4922bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile ssize_t 49233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 49243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 49263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 49273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickOffsetType 49293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy offset; 49303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 49323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 49333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 49353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb, 49363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb, 49373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb; 49383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 494016ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 49413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color; 49423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy register unsigned char 49453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 49463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4947bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 49483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 49493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 49513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count; 49523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4953bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 49543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy loop_level; 49553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile short 49573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop; 49583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 49613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 49623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 49653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 49663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=0, 49673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; /* 0: PNG or JNG; 1: MNG; 2: MNG-LC; 3: MNG-VLC */ 49693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 4970bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 49713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout, 49723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout, 49733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_height, 49753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_width, 49763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 49783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 497938ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp /* These delays are all measured in image ticks_per_second, 498038ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp * not in MNG ticks_per_second 498138ea08308f079e4d21ad8b8ac465dcc3e1d78458glennrp */ 4982bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 49833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay, 49843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay, 49853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay, 49863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay, 49873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 49883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers, 49893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 49903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=1, 49913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0, 49923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_height=0, 49933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy subframe_width=0; 49943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 49953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.top=0; 49963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.bottom=0; 49973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.left=0; 49983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb.right=0; 49993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.top=0; 50003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.bottom=0; 50013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.left=0; 50023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb.right=0; 50033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 500447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Open image file. */ 500547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 50063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 5007e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 50083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image_info->filename); 50093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(exception != (ExceptionInfo *) NULL); 5010e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(exception->signature == MagickCoreSignature); 5011fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter ReadMNGImage()"); 501216ea139d53d867211d3bb0fa859a83de653f687ecristy image=AcquireImage(image_info,exception); 50133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info=(MngInfo *) NULL; 50143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(image_info,image,ReadBinaryBlobMode,exception); 50150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 50173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 50180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 50203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skipping_loop=(-1); 50213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 502247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 502347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate a MngInfo structure. */ 502447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 502573bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 50260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 50273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 50283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 50290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 503047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize members of the MngInfo structure. */ 503147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 50323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 50333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 50343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 50353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 50373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 5039151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy magic_number[MagickPathExtent]; 50403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 504147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Verify MNG signature. */ 50423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,8,(unsigned char *) magic_number); 50433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(magic_number,"\212MNG\r\n\032\n",8) != 0) 50443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 504547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 504647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Initialize some nonzero members of the MngInfo structure. */ 50473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 50483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5049bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].right=(ssize_t) PNG_UINT_31_MAX; 5050bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->object_clip[i].bottom=(ssize_t) PNG_UINT_31_MAX; 50513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 50523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[0]=MagickTrue; 50533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 505447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 50553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickTrue; 50563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=0; 50573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickFalse; /* should be False when converting or mogrifying */ 50593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 50613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=0; 50623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=0; 50633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1; 50643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1UL*image->ticks_per_second; 50653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=0; 50663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 50673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 50683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 50693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=MagickFalse; 50713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 50733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color=image->background_color; 50743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 50753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=mng_info->frame; 50763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=mng_info->frame; 50773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 50783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 5080151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy type[MagickPathExtent]; 50813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(image_info->magick,"MNG") == 0) 50833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 50843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 50853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *chunk; 50863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 50883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read a new chunk. 50893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 50903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[0]='\0'; 5091151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(type,"errr",MagickPathExtent); 50923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=ReadBlobMSBLong(image); 50933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy count=(size_t) ReadBlob(image,4,(unsigned char *) type); 50943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 50953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 50963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5097e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Reading MNG chunk type %c%c%c%c, length: %.20g", 5098e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy type[0],type[1],type[2],type[3],(double) length); 50993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 51003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > PNG_UINT_31_MAX) 510144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp { 510244c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp status=MagickFalse; 510344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp break; 510444c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp } 51050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (count == 0) 51073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"CorruptImage"); 51080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=NULL; 51103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) NULL; 51110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51128fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 51133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) AcquireQuantumMemory(length,sizeof(*chunk)); 511547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (chunk == (unsigned char *) NULL) 51173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 511847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5119bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 51203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[i]=(unsigned char) ReadBlobByte(image); 512147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=chunk; 51233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ReadBlobMSBLong(image); /* read crc word */ 51263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 51273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if !defined(JNG_SUPPORTED) 51283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_JHDR,4) == 0) 51293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 51310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->jhdr_warning == 0) 513316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 51343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"JNGCompressNotSupported","`%s'",image->filename); 51350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->jhdr_warning++; 51373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 51393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DHDR,4) == 0) 51403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 51420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->dhdr_warning == 0) 514416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 51453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DeltaPNGNotSupported","`%s'",image->filename); 51460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->dhdr_warning++; 51483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MEND,4) == 0) 51503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 515147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 51523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (skip_to_iend) 51533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IEND,4) == 0) 51553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickFalse; 51560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51578fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 51583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 51590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 51623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skip to IEND."); 51630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 51653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MHDR,4) == 0) 51683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5169f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length != 28) 5170f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy { 5171f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (chunk) 5172f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 5173f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy ThrowReaderException(CorruptImageError,"CorruptImage"); 5174f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy } 5175f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy 5176bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 51773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 51780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5179bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->mng_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 51803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 51810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 51833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 51843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5185e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG width: %.20g",(double) mng_info->mng_width); 51863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5187e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " MNG height: %.20g",(double) mng_info->mng_height); 51883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 51890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=8; 51918182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->ticks_per_second=(size_t) mng_get_long(p); 51920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second == 0) 51943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=0; 51950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 51963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 51973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=1UL*image->ticks_per_second/ 51983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second; 51990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 52013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy simplicity=0; 52020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5203f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy p+=16; 5204f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy simplicity=(size_t) mng_get_long(p); 52050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=1; /* Full MNG */ 52070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 11) == 11)) 52093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=2; /* LC */ 52100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((simplicity != 0) && ((simplicity | 9) == 9)) 52123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_type=3; /* VLC */ 52130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 52153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type != 3) 52163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy insert_layers=MagickTrue; 52173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 521816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 52193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 522047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 522116ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 52220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 52243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 52250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 52273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 52283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->mng_width > 65535L) || 52313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height > 65535L)) 52323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ImageError,"WidthOrHeightExceedsLimit"); 52330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5234151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(page_geometry,MagickPathExtent, 5235e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy "%.20gx%.20g+0+0",(double) mng_info->mng_width,(double) 5236f2faecf9facdbbb14fcba373365f9f691a9658e0cristy mng_info->mng_height); 52370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.left=0; 5239bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.right=(ssize_t) mng_info->mng_width; 52403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frame.top=0; 5241bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy mng_info->frame.bottom=(ssize_t) mng_info->mng_height; 52423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=default_fb=previous_fb=mng_info->frame; 52430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < MNG_MAX_OBJECTS; i++) 52453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[i]=mng_info->frame; 52460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_TERM,4) == 0) 52523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 52543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=0; 52553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 52568fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 52573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy repeat=p[0]; 52580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (repeat == 3) 52603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52618182b0758e3429fb8dcd1700f09643fd4d80a41ccristy final_delay=(png_uint_32) mng_get_long(&p[2]); 52628182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_iterations=(png_uint_32) mng_get_long(&p[6]); 52630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == PNG_UINT_31_MAX) 52653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_iterations=0; 52660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 52683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickTrue; 52693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 52723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5274280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " repeat=%d, final_delay=%.20g, iterations=%.20g", 5275280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp repeat,(double) final_delay, (double) image->iterations); 52763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 52793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 52803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 52813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_DEFI,4) == 0) 52823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 52833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 528416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 52853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"DEFI chunk found in MNG-VLC datastream","`%s'", 52863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 52870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5288f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length < 2) 5289f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy { 5290f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (chunk) 5291f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 5292f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy ThrowReaderException(CorruptImageError,"CorruptImage"); 5293f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy } 5294f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy 52953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=(p[0] << 8) | p[1]; 52960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 52973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 2 && object_id != 0) 529816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 52993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Nonzero object_id in MNG-LC datastream","`%s'", 53003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 53010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (object_id > MNG_MAX_OBJECTS) 53033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 5305edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp Instead of using a warning we should allocate a larger 53063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo structure and continue. 53073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 530816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 53093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"object id too large","`%s'",image->filename); 53103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy object_id=MNG_MAX_OBJECTS; 53113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[object_id]) 53143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->frozen[object_id]) 53153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 531716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 53183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 53193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "DEFI cannot redefine a frozen MNG object","`%s'", 53203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 53213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 53250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 2) 53273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->invisible[object_id]=p[2]; 53280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object offset info. 53313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 53323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 53333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->x_off[object_id]=(ssize_t) ((p[4] << 24) | 53350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[5] << 16) | (p[6] << 8) | p[7]); 53360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp mng_info->y_off[object_id]=(ssize_t) ((p[8] << 24) | 53380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (p[9] << 16) | (p[10] << 8) | p[11]); 53390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 53413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5343280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " x_off[%d]: %.20g, y_off[%d]: %.20g", 5344280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp object_id,(double) mng_info->x_off[object_id], 5345280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp object_id,(double) mng_info->y_off[object_id]); 53463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 53503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Extract object clipping info. 53513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 53523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 27) 53533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_clip[object_id]=mng_read_box(mng_info->frame,0, 53543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &p[12]); 53550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 53573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_bKGD,4) == 0) 53603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickFalse; 53620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 5) 53643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.red= 53663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 53670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.green= 53693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 53700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_global_bkgd.blue= 53723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 53730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_bkgd=MagickTrue; 53753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 53783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 53793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 53803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BACK,4) == 0) 53813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 53833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 53843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=p[6]; 53850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 53873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mandatory_back=0; 53880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mandatory_back && length > 5) 53903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 53913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.red= 53923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[0] << 8) | p[1])); 53930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.green= 53953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[2] << 8) | p[3])); 53960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 53973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_color.blue= 53983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ScaleShortToQuantum((unsigned short) ((p[4] << 8) | p[5])); 53990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 540016ea139d53d867211d3bb0fa859a83de653f687ecristy mng_background_color.alpha=OpaqueAlpha; 54013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 54043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 54053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_background_object=(p[7] << 8) | p[8]; 54063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 541147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PLTE,4) == 0) 54133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 541447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global PLTE. */ 541547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length && (length < 769)) 54173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->global_plte == (png_colorp) NULL) 54193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte=(png_colorp) AcquireQuantumMemory(256, 54203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sizeof(*mng_info->global_plte)); 54210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5422bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) (length/3); i++) 54233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=p[3*i]; 54253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=p[3*i+1]; 54263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=p[3*i+2]; 54273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 542935ef824baa82511126ff0072ae30eee0da9c05a3cristy mng_info->global_plte_length=(unsigned int) (length/3); 54303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 54323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 54333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].red=i; 54353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].green=i; 54363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte[i].blue=i; 54373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54398fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 54403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=256; 54413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 54423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_plte_length=0; 54440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 544847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_tRNS,4) == 0) 54503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* read global tRNS */ 54523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5453f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy if (length > 0 && length < 257) 5454bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 54553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=p[i]; 54563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_LOOSE 54583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for ( ; i < 256; i++) 54593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_trns[i]=255; 54603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 546112560f31d66b4ef4afdcff2c20807c555dcf2f7dcristy mng_info->global_trns_length=(unsigned int) length; 54623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_gAMA,4) == 0) 54663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 4) 54683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5469bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 54703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy igamma; 54713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54728182b0758e3429fb8dcd1700f09643fd4d80a41ccristy igamma=mng_get_long(p); 54733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_gamma=((float) igamma)*0.00001; 54743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickTrue; 54753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 54783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_gama=MagickFalse; 54790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 54803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 54813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 54823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 54833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 54843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_cHRM,4) == 0) 54853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 548647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read global cHRM */ 548747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 54883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length == 32) 54893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 54908182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.x=0.00001*mng_get_long(p); 54918182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.white_point.y=0.00001*mng_get_long(&p[4]); 54928182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_info->global_chrm.red_primary.x=0.00001*mng_get_long(&p[8]); 54933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.red_primary.y=0.00001* 54948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[12]); 54953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.x=0.00001* 54968182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[16]); 54973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.green_primary.y=0.00001* 54988182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[20]); 54993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.x=0.00001* 55008182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[24]); 55013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_chrm.blue_primary.y=0.00001* 55028182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(&p[28]); 55033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickTrue; 55043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_chrm=MagickFalse; 550747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 551147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sRGB,4) == 0) 55133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 55153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global sRGB. 55163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 55178fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5519e610a071534e448c46460a5aa39ede33bf56b329glennrp mng_info->global_srgb_intent= 5520cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_from_PNG_RenderingIntent(p[0]); 55213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickTrue; 55223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 55233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 55243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_srgb=MagickFalse; 552547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 55273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 552947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_iCCP,4) == 0) 55313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5532fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: */ 55333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 55353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read global iCCP. 55363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 55378fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 553947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 55413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 554247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_FRAM,4) == 0) 55443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type == 3) 554616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 55473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"FRAM chunk found in MNG-VLC datastream","`%s'", 55483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 55490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->framing_mode == 2) || (mng_info->framing_mode == 4)) 55513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 55520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 55543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_timeout=default_frame_timeout; 55553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=default_fb; 555647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55578fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 55583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p[0]) 55593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=p[0]; 55600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 55623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 55633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Framing_mode=%d",mng_info->framing_mode); 55640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 55663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 556747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Note the delay and frame clipping boundaries. */ 556847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* framing mode */ 557047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5571bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy while (*p && ((p-chunk) < (ssize_t) length)) 55723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name */ 557347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* frame name terminator */ 557547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5576bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if ((p-chunk) < (ssize_t) (length-4)) 55773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 55793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay, 55803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout, 55813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping; 55823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 55833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_delay=(*p++); 55843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_timeout=(*p++); 55853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy change_clipping=(*p++); 55863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p++; /* change_sync */ 558747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 55883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay) 55893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 55908182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay=1UL*image->ticks_per_second* 55918182b0758e3429fb8dcd1700f09643fd4d80a41ccristy mng_get_long(p); 55920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55938182b0758e3429fb8dcd1700f09643fd4d80a41ccristy if (mng_info->ticks_per_second != 0) 55948182b0758e3429fb8dcd1700f09643fd4d80a41ccristy frame_delay/=mng_info->ticks_per_second; 55950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5596bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5597bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_delay=PNG_UINT_31_MAX; 55980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 55993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_delay == 2) 56003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_delay=frame_delay; 56010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 56030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5606e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_delay=%.20g",(double) frame_delay); 56073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 560847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_timeout) 56103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5611bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=1UL*image->ticks_per_second* 5612bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp mng_get_long(p); 56130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5614bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp if (mng_info->ticks_per_second != 0) 5615bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout/=mng_info->ticks_per_second; 56160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5617bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp else 5618bb010dd620d8cf1743e64bc12f83e2bf1ffeddddglennrp frame_timeout=PNG_UINT_31_MAX; 56190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56203a89fa4ae8254eda5e264fb9d6bfd97ea3022773glennrp if (change_timeout == 2) 56213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_frame_timeout=frame_timeout; 56220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 56240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5627e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Framing_timeout=%.20g",(double) frame_timeout); 56283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 562947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping) 56313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy fb=mng_read_box(previous_fb,(char) p[0],&p[1]); 56333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=17; 56343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_fb=fb; 56350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 56380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Frame_clip: L=%.20g R=%.20g T=%.20g B=%.20g", 5639e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.left,(double) fb.right,(double) fb.top, 5640e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) fb.bottom); 564147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (change_clipping == 2) 56433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy default_fb=fb; 56443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=fb; 56483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clip=mng_minimum_box(fb,mng_info->frame); 56490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5650bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_width=(size_t) (mng_info->clip.right 56513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.left); 56520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5653bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy subframe_height=(size_t) (mng_info->clip.bottom 56543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy -mng_info->clip.top); 56553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 56563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the frame if framing_mode is 4. 56573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 56583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 56593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 56603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5661e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " subframe_width=%.20g, subframe_height=%.20g",(double) 5662e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy subframe_width,(double) subframe_height); 56630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 4) && 56653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height)) 56663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 566747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 566816ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 56693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 567016ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 567147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 56733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 56753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 56763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 56773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 567847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 56793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 56803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 56830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 56853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 56863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 56873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 56883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 56893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 56900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 56923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 56930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 56943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 56953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 56963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 56973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 56983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 56993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 57003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 57018a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 57023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 570316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 57040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 57063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 57070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert backgd layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 5708e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 5709e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 57103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5715a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 57163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLIP,4) == 0) 57173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 57193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 57203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 57213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 57233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Read CLIP. 57243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 5725a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (length > 3) 5726a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5727a454cdcb00e5a619edb3eac3070b649569448e4aglennrp first_object=(p[0] << 8) | p[1]; 5728a454cdcb00e5a619edb3eac3070b649569448e4aglennrp last_object=(p[2] << 8) | p[3]; 5729a454cdcb00e5a619edb3eac3070b649569448e4aglennrp p+=4; 573047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5731a454cdcb00e5a619edb3eac3070b649569448e4aglennrp for (i=(int) first_object; i <= (int) last_object; i++) 57323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5733a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (mng_info->exists[i] && !mng_info->frozen[i]) 5734a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5735a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngBox 5736a454cdcb00e5a619edb3eac3070b649569448e4aglennrp box; 57373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5738a454cdcb00e5a619edb3eac3070b649569448e4aglennrp box=mng_info->object_clip[i]; 5739a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if ((p-chunk) < (ssize_t) (length-17)) 5740a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->object_clip[i]= 5741a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_read_box(box,(char) p[0],&p[1]); 5742a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 57433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 574447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5745a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 57463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 5749a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 57503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SAVE,4) == 0) 57513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 57533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->exists[i]) 57543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->frozen[i]=MagickTrue; 57563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 57573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ob[i] != (MngBuffer *) NULL) 57583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ob[i]->frozen=MagickTrue; 57593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 57603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57628fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 57633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 57683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((memcmp(type,mng_DISC,4) == 0) || (memcmp(type,mng_SEEK,4) == 0)) 57693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 577047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Read DISC or SEEK. */ 577147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((length == 0) || !memcmp(type,mng_SEEK,4)) 57733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 57743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=1; i < MNG_MAX_OBJECTS; i++) 57753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 57763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 57793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5780bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 57813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy j; 57823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5783f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy for (j=1; j < (ssize_t) length; j+=2) 57843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5785f8d9cb8ed035c1b7df0bb5c73c40038d431eb39fCristy i=p[j-1] << 8 | p[j]; 57863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoDiscardObject(mng_info,i); 57873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 57890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57908fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 57913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 57920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 57933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 57943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 579547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 57963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MOVE,4) == 0) 57973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5798bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 57993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_object, 58003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy last_object; 58013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 580247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* read MOVE */ 580347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5804a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (length > 3) 58053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5806a454cdcb00e5a619edb3eac3070b649569448e4aglennrp first_object=(p[0] << 8) | p[1]; 5807a454cdcb00e5a619edb3eac3070b649569448e4aglennrp last_object=(p[2] << 8) | p[3]; 5808a454cdcb00e5a619edb3eac3070b649569448e4aglennrp p+=4; 58093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5810a454cdcb00e5a619edb3eac3070b649569448e4aglennrp for (i=(ssize_t) first_object; i <= (ssize_t) last_object; i++) 5811a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5812a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (mng_info->exists[i] && !mng_info->frozen[i] && 5813a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (p-chunk) < (ssize_t) (length-8)) 5814a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5815a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngPair 5816a454cdcb00e5a619edb3eac3070b649569448e4aglennrp new_pair; 58173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 5818a454cdcb00e5a619edb3eac3070b649569448e4aglennrp MngPair 5819a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair; 5820a454cdcb00e5a619edb3eac3070b649569448e4aglennrp 5821a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair.a=mng_info->x_off[i]; 5822a454cdcb00e5a619edb3eac3070b649569448e4aglennrp old_pair.b=mng_info->y_off[i]; 5823a454cdcb00e5a619edb3eac3070b649569448e4aglennrp new_pair=mng_read_pair(old_pair,(int) p[0],&p[1]); 5824a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->x_off[i]=new_pair.a; 5825a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->y_off[i]=new_pair.b; 5826a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 5827a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 582947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 58313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 58323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 58333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 58343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_LOOP,4) == 0) 58353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 5836bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t loop_iters=1; 583724e6d42307643613e0430bac65beddf8a43671bdglennrp if (length > 4) 5838a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5839a454cdcb00e5a619edb3eac3070b649569448e4aglennrp loop_level=chunk[0]; 5840a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_active[loop_level]=1; /* mark loop active */ 584147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 5842a454cdcb00e5a619edb3eac3070b649569448e4aglennrp /* Record starting point. */ 5843a454cdcb00e5a619edb3eac3070b649569448e4aglennrp loop_iters=mng_get_long(&chunk[1]); 58440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5845a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (logging != MagickFalse) 5846a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 5847a454cdcb00e5a619edb3eac3070b649569448e4aglennrp " LOOP level %.20g has %.20g iterations ", 5848a454cdcb00e5a619edb3eac3070b649569448e4aglennrp (double) loop_level, (double) loop_iters); 58490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5850a454cdcb00e5a619edb3eac3070b649569448e4aglennrp if (loop_iters == 0) 5851a454cdcb00e5a619edb3eac3070b649569448e4aglennrp skipping_loop=loop_level; 58520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5853a454cdcb00e5a619edb3eac3070b649569448e4aglennrp else 5854a454cdcb00e5a619edb3eac3070b649569448e4aglennrp { 5855a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_jump[loop_level]=TellBlob(image); 5856a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_count[loop_level]=loop_iters; 5857a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 5859a454cdcb00e5a619edb3eac3070b649569448e4aglennrp mng_info->loop_iteration[loop_level]=0; 5860a454cdcb00e5a619edb3eac3070b649569448e4aglennrp } 58613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 58623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 58633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 586447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 58653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_ENDL,4) == 0) 58663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 586724e6d42307643613e0430bac65beddf8a43671bdglennrp if (length > 0) 58683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 586924e6d42307643613e0430bac65beddf8a43671bdglennrp loop_level=chunk[0]; 587024e6d42307643613e0430bac65beddf8a43671bdglennrp 587124e6d42307643613e0430bac65beddf8a43671bdglennrp if (skipping_loop > 0) 58723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 587324e6d42307643613e0430bac65beddf8a43671bdglennrp if (skipping_loop == loop_level) 587424e6d42307643613e0430bac65beddf8a43671bdglennrp { 587524e6d42307643613e0430bac65beddf8a43671bdglennrp /* 587624e6d42307643613e0430bac65beddf8a43671bdglennrp Found end of zero-iteration loop. 587724e6d42307643613e0430bac65beddf8a43671bdglennrp */ 587824e6d42307643613e0430bac65beddf8a43671bdglennrp skipping_loop=(-1); 587924e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_active[loop_level]=0; 588024e6d42307643613e0430bac65beddf8a43671bdglennrp } 58813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 588247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 588324e6d42307643613e0430bac65beddf8a43671bdglennrp else 58843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 588524e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_active[loop_level] == 1) 58863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 588724e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_count[loop_level]--; 588824e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_iteration[loop_level]++; 58890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 589024e6d42307643613e0430bac65beddf8a43671bdglennrp if (logging != MagickFalse) 589124e6d42307643613e0430bac65beddf8a43671bdglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 589224e6d42307643613e0430bac65beddf8a43671bdglennrp " ENDL: LOOP level %.20g has %.20g remaining iters ", 589324e6d42307643613e0430bac65beddf8a43671bdglennrp (double) loop_level,(double) 589424e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_count[loop_level]); 589547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 589624e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_count[loop_level] != 0) 589724e6d42307643613e0430bac65beddf8a43671bdglennrp { 589824e6d42307643613e0430bac65beddf8a43671bdglennrp offset= 589924e6d42307643613e0430bac65beddf8a43671bdglennrp SeekBlob(image,mng_info->loop_jump[loop_level], 590024e6d42307643613e0430bac65beddf8a43671bdglennrp SEEK_SET); 59013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 590224e6d42307643613e0430bac65beddf8a43671bdglennrp if (offset < 0) 590324e6d42307643613e0430bac65beddf8a43671bdglennrp ThrowReaderException(CorruptImageError, 590424e6d42307643613e0430bac65beddf8a43671bdglennrp "ImproperImageHeader"); 590524e6d42307643613e0430bac65beddf8a43671bdglennrp } 590624e6d42307643613e0430bac65beddf8a43671bdglennrp 590724e6d42307643613e0430bac65beddf8a43671bdglennrp else 590824e6d42307643613e0430bac65beddf8a43671bdglennrp { 590924e6d42307643613e0430bac65beddf8a43671bdglennrp short 591024e6d42307643613e0430bac65beddf8a43671bdglennrp last_level; 591124e6d42307643613e0430bac65beddf8a43671bdglennrp 591224e6d42307643613e0430bac65beddf8a43671bdglennrp /* 591324e6d42307643613e0430bac65beddf8a43671bdglennrp Finished loop. 591424e6d42307643613e0430bac65beddf8a43671bdglennrp */ 591524e6d42307643613e0430bac65beddf8a43671bdglennrp mng_info->loop_active[loop_level]=0; 591624e6d42307643613e0430bac65beddf8a43671bdglennrp last_level=(-1); 591724e6d42307643613e0430bac65beddf8a43671bdglennrp for (i=0; i < loop_level; i++) 591824e6d42307643613e0430bac65beddf8a43671bdglennrp if (mng_info->loop_active[i] == 1) 591924e6d42307643613e0430bac65beddf8a43671bdglennrp last_level=(short) i; 592024e6d42307643613e0430bac65beddf8a43671bdglennrp loop_level=last_level; 592124e6d42307643613e0430bac65beddf8a43671bdglennrp } 59223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 592547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 59273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 59283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 592947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_CLON,4) == 0) 59313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->clon_warning == 0) 593316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 59343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"CLON is not implemented yet","`%s'", 59353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 593647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->clon_warning++; 59383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 593947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_MAGN,4) == 0) 59413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 59423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 59433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first, 59443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last, 59453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb, 59463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml, 59473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr, 59483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt, 59493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx, 59503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my, 59513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx, 59523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy; 59533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 1) 59553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=(p[0] << 8) | p[1]; 59560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_first=0; 59590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 3) 59613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=(p[2] << 8) | p[3]; 59620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 59633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_last=magn_first; 59653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef MNG_OBJECT_BUFFERS 59663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first || magn_last) 59673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 59683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 596916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 59703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 59713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MAGN is not implemented yet for nonzero objects", 59723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image->filename); 597347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 59753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 59763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 59773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 4) 59783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=p[4]; 597947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=0; 59823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 6) 59843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=(p[5] << 8) | p[6]; 598547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 598847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mx == 0) 59903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mx=1; 59913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 59923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 59933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=(p[7] << 8) | p[8]; 599447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 59963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=magn_mx; 599747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 59983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_my == 0) 59993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_my=1; 60003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 10) 60023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=(p[9] << 8) | p[10]; 600347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=magn_mx; 600647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_ml == 0) 60083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_ml=1; 60093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 12) 60113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=(p[11] << 8) | p[12]; 601247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=magn_mx; 601547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mr == 0) 60173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mr=1; 60183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 14) 60203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=(p[13] << 8) | p[14]; 602147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=magn_my; 602447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mt == 0) 60263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mt=1; 60273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 16) 60293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=(p[15] << 8) | p[16]; 603047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=magn_my; 603347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_mb == 0) 60353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_mb=1; 60363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 60373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 60383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=p[17]; 603947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=magn_methx; 60423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 604347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx > 5 || magn_methy > 5) 60453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_warning == 0) 60463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 604716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 60483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetMagickModule(),CoderError, 60493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "Unknown MAGN method in MNG datastream","`%s'", 60503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 605147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_warning++; 60533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_OBJECT_BUFFERS 60553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Magnify existing objects in the range magn_first to magn_last */ 60563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 60573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_first == 0 || magn_last == 0) 60583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Save the magnification factors for object 0 */ 60603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mb=magn_mb; 60613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_ml=magn_ml; 60623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mr=magn_mr; 60633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mt=magn_mt; 60643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_mx=magn_mx; 60653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_my=magn_my; 60663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methx=magn_methx; 60673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->magn_methy=magn_methy; 60683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 60693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 607047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_PAST,4) == 0) 60723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->past_warning == 0) 607416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 60753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"PAST is not implemented yet","`%s'", 60763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 607747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->past_warning++; 60793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 608047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_SHOW,4) == 0) 60823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->show_warning == 0) 608416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 60853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"SHOW is not implemented yet","`%s'", 60863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 608747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->show_warning++; 60893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 609047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_sBIT,4) == 0) 60923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 4) 60943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickFalse; 609547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 60963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 60973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 60983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.gray=p[0]; 60993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.red=p[0]; 61003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.green=p[1]; 61013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.blue=p[2]; 61023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_sbit.alpha=p[3]; 61033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_sbit=MagickTrue; 61043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYs,4) == 0) 61073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 8) 61093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_x_pixels_per_unit= 61118182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(p); 61123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_y_pixels_per_unit= 61138182b0758e3429fb8dcd1700f09643fd4d80a41ccristy (size_t) mng_get_long(&p[4]); 61143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->global_phys_unit_type=p[8]; 61153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickTrue; 61163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 611747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_global_phys=MagickFalse; 61203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_pHYg,4) == 0) 61223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->phyg_warning == 0) 612416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 61253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"pHYg is not implemented.","`%s'",image->filename); 612647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->phyg_warning++; 61283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 61293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_BASI,4) == 0) 61303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 613247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->basi_warning == 0) 613416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 61353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"BASI is not implemented yet","`%s'", 61363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->filename); 613747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->basi_warning++; 61393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_BASI_SUPPORTED 6140bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_width=(size_t) ((p[0] << 24) | (p[1] << 16) | 61413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[2] << 8) | p[3]); 6142bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy basi_height=(size_t) ((p[4] << 24) | (p[5] << 16) | 61433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (p[6] << 8) | p[7]); 61443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_color_type=p[8]; 61453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_compression_method=p[9]; 61463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_filter_type=p[10]; 61473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_interlace_method=p[11]; 61483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 11) 61493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=(p[12] << 8) & p[13]; 615047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_red=0; 615347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 13) 61553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=(p[14] << 8) & p[15]; 615647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_green=0; 615947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 15) 61613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=(p[16] << 8) & p[17]; 616247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_blue=0; 616547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 17) 61673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=(p[18] << 8) & p[19]; 616847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (basi_sample_depth == 16) 61723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=65535L; 61733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_alpha=255; 61753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 617647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length > 19) 61783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=p[20]; 617947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 61813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy basi_viewable=0; 618247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 61853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 61863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 618747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) 61893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 61903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy && memcmp(type,mng_JHDR,4) 61913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 61923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ) 61933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 61943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Not an IHDR or JHDR chunk */ 61958fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (length != 0) 61963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 619747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 61983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 61993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Process IHDR */ 62013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 62023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 62033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing %c%c%c%c chunk",type[0],type[1],type[2],type[3]); 620447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->exists[object_id]=MagickTrue; 62063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->viewable[object_id]=MagickTrue; 620747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->invisible[object_id]) 62093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 62113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 62123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Skipping invisible object"); 621347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy skip_to_iend=MagickTrue; 62153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 62163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy continue; 62173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 62193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (length < 8) 62203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 622147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62228182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_width=(size_t) mng_get_long(p); 62238182b0758e3429fb8dcd1700f09643fd4d80a41ccristy image_height=(size_t) mng_get_long(&p[4]); 62243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 62253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk=(unsigned char *) RelinquishMagickMemory(chunk); 62263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 62273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a transparent background layer behind the entire animation 62293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if it is not full screen. 62303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 62313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 62323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && mng_type && first_mng_object) 62333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->clip.left > 0) || (mng_info->clip.top > 0) || 62353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_width < mng_info->mng_width) || 6236bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.right < (ssize_t) mng_info->mng_width) || 62373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_height < mng_info->mng_height) || 6238bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (mng_info->clip.bottom < (ssize_t) mng_info->mng_height)) 62393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 624016ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 62413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 62443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 624516ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 624647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 62483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 62503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 62513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 62523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 625347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 62553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 625747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 62593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 62613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 62623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 62633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 626447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 62663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 626747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 626847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Make a background rectangle. */ 626947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 62703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 62713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 62723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 62733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 62743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 62753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 62763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 62773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 627816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 62793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 62803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6281e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Inserted transparent background layer, W=%.20g, H=%.20g", 6282e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->mng_width,(double) mng_info->mng_height); 62833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 62853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer behind the upcoming image if 62873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy framing_mode is 3, and we haven't already inserted one. 62883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 62893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && (mng_info->framing_mode == 3) && 62903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (subframe_width) && (subframe_height) && (simplicity == 0 || 62913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (simplicity & 0x08))) 62923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 629316ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 62943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 62953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 62963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 62973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 629816ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 629947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 63013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 63033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 63043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 63053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 630647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 63083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 63110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 63133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 63153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 63163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 63173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 632147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 63233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=subframe_width; 63243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=subframe_height; 63253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=subframe_width; 63263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=subframe_height; 63273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->clip.left; 63283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->clip.top; 63293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 63308a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 633116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 63320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 63343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 63350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Insert background layer, L=%.20g, R=%.20g T=%.20g, B=%.20g", 6336e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.left,(double) mng_info->clip.right, 6337e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) mng_info->clip.top,(double) mng_info->clip.bottom); 63383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif /* MNG_INSERT_LAYERS */ 63403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy first_mng_object=MagickFalse; 634147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 634216ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 63433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 63453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 63463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 634716ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 634847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 63503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 63523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 63533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 63543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 635547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 63573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 63593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,LoadImagesTag,TellBlob(image), 63603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetBlobSize(image)); 63610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 63633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 63640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (term_chunk_found) 63663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 63683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy term_chunk_found=MagickFalse; 63693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickFalse; 63730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->framing_mode == 1 || mng_info->framing_mode == 3) 63753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 63763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=frame_delay; 63773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy frame_delay=default_frame_delay; 63783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 63790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 63813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=0; 63820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 63833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 63843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 63853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=mng_info->x_off[object_id]; 63863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=mng_info->y_off[object_id]; 63873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 638847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 63903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Seek back to the beginning of the IHDR or JHDR chunk's length field. 63913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 639247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 63933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 63943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 63953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Seeking back to beginning of %c%c%c%c chunk",type[0],type[1], 63963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy type[2],type[3]); 639747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6398bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy offset=SeekBlob(image,-((ssize_t) length+12),SEEK_CUR); 639947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (offset < 0) 64013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(CorruptImageError,"ImproperImageHeader"); 64023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 64053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->mng_type=mng_type; 64063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->object_id=object_id; 64073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (memcmp(type,mng_IHDR,4) == 0) 64093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOnePNGImage(mng_info,image_info,exception); 641047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 64123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=ReadOneJNGImage(mng_info,image_info,exception); 64143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 64153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image == (Image *) NULL) 64173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6418889a928b732161b6353bd880e5ea0802f184c6d4glennrp if (logging != MagickFalse) 6419889a928b732161b6353bd880e5ea0802f184c6d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6420889a928b732161b6353bd880e5ea0802f184c6d4glennrp "exit ReadJNGImage() with error"); 642147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 64233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 64243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 64263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns == 0 || image->rows == 0) 64273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 64293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 64303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 64313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 64323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 64330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 64343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 64353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_type) 64373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngBox 64393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box; 64403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx || mng_info->magn_methy) 64423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 64443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height, 64453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width; 64463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 64483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 64493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Processing MNG MAGN chunk"); 64503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 64513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methx == 1) 64523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width=mng_info->magn_ml; 645447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 64563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr; 645747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 645947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 646047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-2)*(mng_info->magn_mx)); 64613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 646247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64654e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_width=(png_uint_32) image->columns; 646647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 1) 64683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_ml-1; 646947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 2) 64713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width += mng_info->magn_mr-1; 647247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->columns > 3) 647447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_width += (png_uint_32) 647547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->columns-3)*(mng_info->magn_mx-1)); 64763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 647747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->magn_methy == 1) 64793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height=mng_info->magn_mt; 648147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 64833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb; 648447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 648647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 648747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-2)*(mng_info->magn_my)); 64883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 648947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 64913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 64924e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy magnified_height=(png_uint_32) image->rows; 649347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 1) 64953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mt-1; 649647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 64973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 2) 64983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_height += mng_info->magn_mb-1; 649947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rows > 3) 650147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp magnified_height += (png_uint_32) 650247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp ((image->rows-3)*(mng_info->magn_my-1)); 65033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 650447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magnified_height > image->rows || 65063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magnified_width > image->columns) 65073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 65093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *large_image; 65103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 65123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy; 65133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 651416ea139d53d867211d3bb0fa859a83de653f687ecristy Quantum 651516ea139d53d867211d3bb0fa859a83de653f687ecristy *next, 651616ea139d53d867211d3bb0fa859a83de653f687ecristy *prev; 651716ea139d53d867211d3bb0fa859a83de653f687ecristy 651816ea139d53d867211d3bb0fa859a83de653f687ecristy png_uint_16 651916ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methx, 652016ea139d53d867211d3bb0fa859a83de653f687ecristy magn_methy; 652116ea139d53d867211d3bb0fa859a83de653f687ecristy 6522bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 65233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m, 65243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 65253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 652616ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 65273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *n, 65283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *q; 65293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 653016ea139d53d867211d3bb0fa859a83de653f687ecristy register ssize_t 653116ea139d53d867211d3bb0fa859a83de653f687ecristy x; 65323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 653347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp /* Allocate next image structure. */ 653447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 65363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 65373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocate magnified image"); 653847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 653916ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 654047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 65423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 65443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 65453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 65463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image=SyncNextImageInList(image); 65493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->columns=magnified_width; 65513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy large_image->rows=magnified_height; 65523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=mng_info->magn_methx; 65543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=mng_info->magn_methy; 65553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 65563faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 65573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM unsigned short 65583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 65593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 65613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Scale pixels to unsigned shorts to prevent 65623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy overflow of intermediate values of interpolations 65633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6564bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 65653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 65663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1, 65673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 656847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6569bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 65703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 657116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleQuantumToShort( 657216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 657316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleQuantumToShort( 657416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 657516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleQuantumToShort( 657616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 657716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleQuantumToShort( 657816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 657916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 65803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 658147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 65833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 65843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 65863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 65873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define QM Quantum 65883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 65893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 659017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 659116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 659247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 65943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 659516ea139d53d867211d3bb0fa859a83de653f687ecristy large_image->background_color.alpha=OpaqueAlpha; 659616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(large_image,exception); 659747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 65983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 65993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=2; 660047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 66023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methx=3; 660347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 66053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=2; 660647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 66083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy magn_methy=3; 66093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the rows into the right side of the large image */ 66123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 66143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6615e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the rows to %.20g",(double) large_image->rows); 6616bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 66173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy yy=0; 66184f7c434c6c7047588b48a5b71281f9ecf4c9d1accristy length=(size_t) GetPixelChannels(image)*image->columns; 661916ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) AcquireQuantumMemory(length,sizeof(*next)); 662016ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) AcquireQuantumMemory(length,sizeof(*prev)); 662147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 662216ea139d53d867211d3bb0fa859a83de653f687ecristy if ((prev == (Quantum *) NULL) || 662316ea139d53d867211d3bb0fa859a83de653f687ecristy (next == (Quantum *) NULL)) 66243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 66263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 66273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError, 66283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "MemoryAllocationFailed"); 66293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 663047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,0,image->columns,1,exception); 66323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 663347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6634bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 66353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (y == 0) 6637bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mt; 663847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6639bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-2) 6640bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 664147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6642bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy <= 1 && y == (ssize_t) image->rows-1) 6643bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mb; 664447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6645bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methy > 1 && y == (ssize_t) image->rows-1) 66463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 664747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6649bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_my; 665047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=prev; 66523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy prev=next; 66533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=n; 665447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6655bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (y < (ssize_t) image->rows-1) 66563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=GetAuthenticPixels(image,0,y+1,image->columns,1, 66583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy exception); 66593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickMemory(next,n,length); 66603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 666147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++, yy++) 66633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 666416ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 66653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 66663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6667bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy assert(yy < (ssize_t) large_image->rows); 66683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy pixels=prev; 66693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy n=next; 66703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(large_image,0,yy,large_image->columns, 66719fff7b4fa7d657da7bfed66239982b85c6337de9cristy 1,exception); 667216ea139d53d867211d3bb0fa859a83de653f687ecristy q+=(large_image->columns-image->columns)* 667316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelChannels(large_image); 667447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6675bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 66763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6677fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: get color as function of indexes[x] */ 66783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 66793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->storage_class == PseudoClass) 66803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 66823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 66833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 66843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy <= 1) 66853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 6686bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /* replicate previous */ 668716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,pixels),q); 668816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 668916ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 669016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 669116ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 669216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 669316ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 66943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 669547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 66963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methy == 2 || magn_methy == 4) 66973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 66983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6699bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 670016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 670116ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 670216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 670316ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 670416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 670516ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 670616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 670716ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6708bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 670947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 67113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 671316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,((QM) (((ssize_t) 671416ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelRed(image,n) 671516ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels)+m))/ 6716bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 671716ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelRed(image,pixels)))),q); 671816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,((QM) (((ssize_t) 671916ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelGreen(image,n) 672016ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels)+m))/ 6721bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 672216ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelGreen(image,pixels)))),q); 672316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,((QM) (((ssize_t) 672416ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelBlue(image,n) 672516ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels)+m))/ 6726bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 672716ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelBlue(image,pixels)))),q); 672847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 672917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 673016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image, ((QM) (((ssize_t) 673116ea139d53d867211d3bb0fa859a83de653f687ecristy (2*i*(GetPixelAlpha(image,n) 673216ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)+m)) 6733bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 673416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)))),q); 67353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 673647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 4) 67383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 67403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 674116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 674216ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 67433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 674416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 674516ea139d53d867211d3bb0fa859a83de653f687ecristy n),q); 67463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 674847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methy == 3 || magn_methy == 5) */ 67503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 67513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 67523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6753bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 675416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image, 675516ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 675616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image, 675716ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 675816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image, 675916ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 676016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image, 676116ea139d53d867211d3bb0fa859a83de653f687ecristy pixels),q); 6762bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 676347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6765bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 676616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(large_image,GetPixelRed(image,n),q); 676716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(large_image,GetPixelGreen(image,n), 676816ea139d53d867211d3bb0fa859a83de653f687ecristy q); 676916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(large_image,GetPixelBlue(image,n), 677016ea139d53d867211d3bb0fa859a83de653f687ecristy q); 677116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,GetPixelAlpha(image,n), 677216ea139d53d867211d3bb0fa859a83de653f687ecristy q); 6773bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 677447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methy == 5) 67763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 677716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(large_image,(QM) (((ssize_t) (2*i* 677816ea139d53d867211d3bb0fa859a83de653f687ecristy (GetPixelAlpha(image,n) 677916ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels)) 6780bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp +m))/((ssize_t) (m*2)) 678116ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 67823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 67833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 678416ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 678516ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(large_image); 678616ea139d53d867211d3bb0fa859a83de653f687ecristy pixels+=GetPixelChannels(image); 67873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* x */ 678847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(large_image,exception) == 0) 67903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 679147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 67923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* i */ 67933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* y */ 679447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 679516ea139d53d867211d3bb0fa859a83de653f687ecristy prev=(Quantum *) RelinquishMagickMemory(prev); 679616ea139d53d867211d3bb0fa859a83de653f687ecristy next=(Quantum *) RelinquishMagickMemory(next); 67973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 67983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=image->columns; 67993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 68023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Delete original image"); 68033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy DeleteImageFromList(&image); 68053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=large_image; 68073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 68093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* magnify the columns */ 68113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 68123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 6813e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Magnify the columns to %.20g",(double) image->columns); 68143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 6815bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 68163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 681716ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 68183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *pixels; 68193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 68203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 682116ea139d53d867211d3bb0fa859a83de653f687ecristy pixels=q+(image->columns-length)*GetPixelChannels(image); 682216ea139d53d867211d3bb0fa859a83de653f687ecristy n=pixels+GetPixelChannels(image); 682347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6824bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) (image->columns-length); 6825bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy x < (ssize_t) image->columns; x++) 68263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 682716ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 68287c7b31566a7598be23cac1b5e32c697cfe7082f4glennrp 6829bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy if (x == (ssize_t) (image->columns-length)) 6830bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_ml; 683147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6832bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-2) 6833bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 683447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6835bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx <= 1 && x == (ssize_t) image->columns-1) 6836bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mr; 683747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6838bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy else if (magn_methx > 1 && x == (ssize_t) image->columns-1) 68393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy m=1; 684047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6842bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy m=(ssize_t) mng_info->magn_mx; 684347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (i=0; i < m; i++) 68453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx <= 1) 68473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* replicate previous */ 684916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 685016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 685116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 685216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 68533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 685447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (magn_methx == 2 || magn_methx == 4) 68563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i == 0) 6858bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 685916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 686016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 686116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 686216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6863bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 686447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 686516ea139d53d867211d3bb0fa859a83de653f687ecristy /* To do: Rewrite using Get/Set***PixelChannel() */ 68663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 68673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 686916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,(QM) ((2*i*( 687016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,n) 687116ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelRed(image,pixels))+m) 6872bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 687316ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,pixels)),q); 6874bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 687516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,(QM) ((2*i*( 687616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,n) 687716ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelGreen(image,pixels))+m) 6878bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 687916ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,pixels)),q); 6880bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 688116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,(QM) ((2*i*( 688216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,n) 688316ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelBlue(image,pixels))+m) 6884bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 688516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,pixels)),q); 688617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 688716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,(QM) ((2*i*( 688816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n) 688916ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m) 6890bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp /((ssize_t) (m*2))+ 689116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)),q); 68923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 689347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 68943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 4) 68953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 68963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 68973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6898bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 689916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 690016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,pixels)+0,q); 6901bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 69023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6903bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 690416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 690516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,n)+0,q); 6906bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 69073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 690947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else /* if (magn_methx == 3 || magn_methx == 5) */ 69113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Replicate nearest */ 69133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i <= ((m+1) << 1)) 6914bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 691516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,pixels),q); 691616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,pixels),q); 691716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,pixels),q); 691816ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,pixels),q); 6919bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 692047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 6922bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp { 692316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,GetPixelRed(image,n),q); 692416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,GetPixelGreen(image,n),q); 692516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,GetPixelBlue(image,n),q); 692616ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,GetPixelAlpha(image,n),q); 6927bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 692847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx == 5) 69303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Interpolate */ 693216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image, 693316ea139d53d867211d3bb0fa859a83de653f687ecristy (QM) ((2*i*( GetPixelAlpha(image,n) 693416ea139d53d867211d3bb0fa859a83de653f687ecristy -GetPixelAlpha(image,pixels))+m)/ 6935bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp ((ssize_t) (m*2)) 693616ea139d53d867211d3bb0fa859a83de653f687ecristy +GetPixelAlpha(image,pixels)),q); 69373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 693916ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 69403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 694116ea139d53d867211d3bb0fa859a83de653f687ecristy n+=GetPixelChannels(image); 69423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 694347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 69453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 69463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69473faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 69483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (magn_methx != 1 || magn_methy != 1) 69493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 69513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Rescale pixels to Quantum 69523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 6953bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 69543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 69553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 695647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 6957bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (x=(ssize_t) image->columns-1; x >= 0; x--) 69583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 695916ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleShortToQuantum( 696016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q)),q); 696116ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelGreen(image,ScaleShortToQuantum( 696216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q)),q); 696316ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelBlue(image,ScaleShortToQuantum( 696416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q)),q); 696516ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,ScaleShortToQuantum( 696616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q)),q); 696716ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 69683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 696947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 69703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (SyncAuthenticPixels(image,exception) == MagickFalse) 69713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 69723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 69753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 69763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 69773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished MAGN processing"); 69783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 69803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 69813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 69823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_box is with respect to the upper left corner of the MNG. 69833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 69843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.left=mng_info->image_box.left+mng_info->x_off[object_id]; 69853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.right=mng_info->image_box.right+mng_info->x_off[object_id]; 69863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.top=mng_info->image_box.top+mng_info->y_off[object_id]; 69873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box.bottom=mng_info->image_box.bottom+mng_info->y_off[object_id]; 69883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->clip); 69893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->frame); 69903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_box=mng_minimum_box(crop_box,mng_info->object_clip[object_id]); 69913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left != (mng_info->image_box.left 69923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 69933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.right != (mng_info->image_box.right 69943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->x_off[object_id])) || 69953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top != (mng_info->image_box.top 69963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id])) || 69973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.bottom != (mng_info->image_box.bottom 69983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy +mng_info->y_off[object_id]))) 69993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Crop the PNG image"); 700347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((crop_box.left < crop_box.right) && 70053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (crop_box.top < crop_box.bottom)) 70063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 70083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *im; 70093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy RectangleInfo 70113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info; 70123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Crop_info is with respect to the upper left corner of 70153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the image. 70163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.x=(crop_box.left-mng_info->x_off[object_id]); 70183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy crop_info.y=(crop_box.top-mng_info->y_off[object_id]); 7019bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.width=(size_t) (crop_box.right-crop_box.left); 7020bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy crop_info.height=(size_t) (crop_box.bottom-crop_box.top); 70213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 70223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 70233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 70243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 70253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=CropImage(image,&crop_info,exception); 702647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (im != (Image *) NULL) 70283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=im->columns; 70303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=im->rows; 70313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy im=DestroyImage(im); 70323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=image->columns; 70333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=image->rows; 70343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=crop_box.left; 70353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=crop_box.top; 70363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 703847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 70403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 70423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy No pixels in crop area. The MNG spec still requires 70433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy a layer, though, so make a single transparent pixel in 70443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the top left corner. 70453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 70463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=1; 70473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=1; 70483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->colors=2; 704916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 70503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=1; 70513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=1; 70523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 70533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 70543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifndef PNG_READ_EMPTY_PLTE_SUPPORTED 70573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=mng_info->image; 70583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 70593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 70603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 70612b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 70622b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 706316ea139d53d867211d3bb0fa859a83de653f687ecristy * if lossy. 70642b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 70652b013e4b9b602533eff410e61c3683fb2a3ab913glennrp if (image->depth > 16) 70662b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 70672b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 70682b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 70693faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 7070cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 7071cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 7072cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 7073cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 7074cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 7075cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 707616ea139d53d867211d3bb0fa859a83de653f687ecristy if (LosslessReduceDepthOK(image,exception) != MagickFalse) 70778640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 70783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 7079d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->number_scenes != 0) 70813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 70823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->scenes_found > 7083bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (ssize_t) (image_info->first_scene+image_info->number_scenes)) 70843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 70853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 7086d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading image datastream."); 7090d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp 70913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (LocaleCompare(image_info->magick,"MNG") == 0); 709247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 709447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 70963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 70973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Finished reading all image datastreams."); 709847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 70993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MNG_INSERT_LAYERS) 71003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers && !mng_info->image_found && (mng_info->mng_width) && 71013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->mng_height)) 71023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 71043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Insert a background layer if nothing else was found. 71053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 71063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No images found. Inserting a background layer."); 71090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 711016ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetAuthenticPixelQueue(image) != (Quantum *) NULL) 71113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 71133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate next image structure. 71143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 711516ea139d53d867211d3bb0fa859a83de653f687ecristy AcquireNextImage(image_info,image,exception); 71163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 71173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 71193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 712047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Allocation failed, returning NULL."); 712447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 71263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 71283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->columns=mng_info->mng_width; 71303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->rows=mng_info->mng_height; 71313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.width=mng_info->mng_width; 71323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.height=mng_info->mng_height; 71333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.x=0; 71343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->page.y=0; 71353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->background_color=mng_background_color; 71368a46d827a124555f0c48fb2368ec1bba8e079ab6cristy image->alpha_trait=UndefinedPixelTrait; 71370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->ping == MagickFalse) 713916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageBackgroundColor(image,exception); 71400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image_found++; 71423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 71443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->iterations=mng_iterations; 71450fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_iterations == 1) 71473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 71480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 71503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 71523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count > 10*mng_info->image_found) 71533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," No beginning"); 715647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 715716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted, beginning of list not found", 71593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 716047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 71623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 71650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 71663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 71673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Corrupt list"); 717047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 717116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"Linked list is corrupted; next_image is NULL","`%s'", 71733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 71743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 71753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 717647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second && mng_info->image_found > 1 && 71783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetNextImageInList(image) == 71793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (Image *) NULL) 71803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " First image null"); 718447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 718516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"image->next for first image is NULL but shouldn't be.", 71873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "`%s'",image_info->filename); 71883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 718947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->image_found == 0) 71913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 71923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 71933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 71943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " No visible images found."); 719547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 719616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 71973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy CoderError,"No visible images in file","`%s'",image_info->filename); 719847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 71993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image != (Image *) NULL) 72003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 720147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 72033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return((Image *) NULL); 72043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->ticks_per_second) 72073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=1UL*MagickMax(image->ticks_per_second,1L)* 72083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/mng_info->ticks_per_second; 72090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 72113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->start_loop=MagickTrue; 72120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Find final nonzero image delay */ 72143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=0; 72150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 72173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay) 72193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_image_delay=image->delay; 722047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 72223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay < final_image_delay) 72253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=final_image_delay; 72260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay=final_delay; 72280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7231e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image->delay=%.20g, final_delay=%.20g",(double) image->delay, 7232e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) final_delay); 72330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 72343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 72373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 72383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 72403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 724147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 72433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Before coalesce:"); 724447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7246e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g",(double) image->delay); 724747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 72493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 72513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7252e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g",(double) scene++,(double) image->delay); 72533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 72553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 72573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef MNG_COALESCE_LAYERS 72583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (insert_layers) 72593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 72613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image, 72623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next; 72633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7264bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 72653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 72663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 72673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 72683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule()," Coalesce Images"); 726947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=image->scene; 727116ea139d53d867211d3bb0fa859a83de653f687ecristy next_image=CoalesceImages(image,exception); 727247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 72743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowReaderException(ResourceLimitError,"MemoryAllocationFailed"); 727547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=DestroyImageList(image); 72773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 727847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next=image; next != (Image *) NULL; next=next_image) 72803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.width=mng_info->mng_width; 72823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.height=mng_info->mng_height; 72833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.x=0; 72843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->page.y=0; 72853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->scene=scene++; 72863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next); 728747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image == (Image *) NULL) 72893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 729047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 72913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next->delay == 0) 72923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 72933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene--; 72943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->previous=GetPreviousImageInList(next); 72953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetPreviousImageInList(next) == (Image *) NULL) 72963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=next_image; 72973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 72983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next->previous->next=next_image; 72993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next=DestroyImage(next); 73003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 73033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 73043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 73063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetNextImageInList(image); 730747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->dispose=BackgroundDispose; 73093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 73113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 73133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 73143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 73163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 731747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 73193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " After coalesce:"); 732047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7322e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene 0 delay=%.20g dispose=%.20g",(double) image->delay, 7323e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->dispose); 732447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetNextImageInList(image) != (Image *) NULL) 7326f2faecf9facdbbb14fcba373365f9f691a9658e0cristy { 7327f2faecf9facdbbb14fcba373365f9f691a9658e0cristy image=GetNextImageInList(image); 732847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7329f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 7330e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " scene %.20g delay=%.20g dispose=%.20g",(double) scene++, 7331e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) image->delay,(double) image->dispose); 7332f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 7333f2faecf9facdbbb14fcba373365f9f691a9658e0cristy } 733447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetFirstImageInList(image); 73363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 73373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 733847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 73403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit ReadMNGImage()"); 734147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(GetFirstImageInList(image)); 73433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 734425c1e2baba76d9cf3ec582f217f96af95259e747glennrp#else /* PNG_LIBPNG_VER > 10011 */ 73453ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadPNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 73463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 73483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 734947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 73513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "PNG library is too old","`%s'",image_info->filename); 735247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(Image *) NULL; 73543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 735547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 73563ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic Image *ReadMNGImage(const ImageInfo *image_info,ExceptionInfo *exception) 73573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(ReadPNGImage(image_info,exception)); 73593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 736025c1e2baba76d9cf3ec582f217f96af95259e747glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 73613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 73623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 73643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% R e g i s t e r P N G I m a g e % 73693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 73723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 73733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% RegisterPNGImage() adds properties for the PNG image format to 73753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the list of supported formats. The properties include the image format 73763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% tag, a method to read and/or write the format, whether the format 73773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% supports the saving of more than one frame to the same file or blob, 73783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% whether the format supports native in-memory I/O, and a brief 73793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% description of the format. 73803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the RegisterPNGImage method is: 73823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 7383bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy% size_t RegisterPNGImage(void) 73843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 73853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 7386bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristyModuleExport size_t RegisterPNGImage(void) 73873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 73883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 7389151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy version[MagickPathExtent]; 73903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickInfo 73923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *entry; 73933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 73943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy static const char 73953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *PNGNote= 73963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 73973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/ for details about the PNG format." 73983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 739947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *JNGNote= 74013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the JNG\n" 74033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 74043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }, 740547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *MNGNote= 74073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 74083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "See http://www.libpng.org/pub/mng/ for details about the MNG\n" 74093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "format." 74103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy }; 74113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 74123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 741347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_LIBPNG_VER_STRING) 7415151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,"libpng ",MagickPathExtent); 7416151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,PNG_LIBPNG_VER_STRING,MagickPathExtent); 741747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(PNG_LIBPNG_VER_STRING,png_get_header_ver(NULL)) != 0) 74193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7420151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,",",MagickPathExtent); 74213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(version,png_get_libpng_ver(NULL), 7422151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickPathExtent); 74233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 742547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 742606b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","MNG","Multiple-image Network Graphics"); 742708e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags|=CoderSeekableStreamFlag; /* To do: eliminate this. */ 742847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadMNGImage; 74313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteMNGImage; 74323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 743347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsMNG; 743547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 743847b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7439afc97b1e31b78c973c4bf5e0be8d5090cfca8065glennrp entry->mime_type=ConstantString("video/x-mng"); 74403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(MNGNote); 74413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 744306b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG","Portable Network Graphics"); 744447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 744947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 745108e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7452d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 745347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 745647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(PNGNote); 74583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 746006b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG8", 746106b627a07ff44e1ff93ef1288c9f428066ded10ddirk "8-bit indexed with optional binary transparency"); 746247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 746747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 746908e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7470d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 74713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 74723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 747306b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG24", 747406b627a07ff44e1ff93ef1288c9f428066ded10ddirk "opaque or binary transparent 24-bit RGB"); 74753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *version='\0'; 747647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(ZLIB_VERSION) 7478151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,"zlib ",MagickPathExtent); 7479151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,ZLIB_VERSION,MagickPathExtent); 748047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(ZLIB_VERSION,zlib_version) != 0) 74823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 7483151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,",",MagickPathExtent); 7484151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) ConcatenateMagickString(version,zlib_version,MagickPathExtent); 74853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 74863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 748747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*version != '\0') 74893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->version=ConstantString(version); 749047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 74923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 74933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 74943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 749547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 74963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 749708e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7498d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 74993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 75003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 750106b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG32","opaque or transparent 32-bit RGBA"); 750247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 75043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadPNGImage; 75053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WritePNGImage; 75063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 750747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsPNG; 750908e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7510d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 75113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 75123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 751306b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG48", 751406b627a07ff44e1ff93ef1288c9f428066ded10ddirk "opaque or binary transparent 48-bit RGB"); 7515fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7516fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 7517fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 7518fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 7519fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#endif 7520fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7521fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 752208e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7523d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 7524fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) RegisterMagickInfo(entry); 7525fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 752606b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG64","opaque or transparent 64-bit RGBA"); 7527fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7528fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 7529fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 7530fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 7531fd164d2bf84b111e304959af5698757d60e9b8aeglennrp#endif 7532fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 7533fd164d2bf84b111e304959af5698757d60e9b8aeglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 753408e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7535d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 7536fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) RegisterMagickInfo(entry); 7537fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 753806b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","PNG00", 7539698aab67f255491ec6bd984c9d0163990df57622glennrp "PNG inheriting bit-depth, color-type from original, if possible"); 75405830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 75415830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp#if defined(MAGICKCORE_PNG_DELEGATE) 75425830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->decoder=(DecodeImageHandler *) ReadPNGImage; 75435830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->encoder=(EncodeImageHandler *) WritePNGImage; 75445830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp#endif 75455830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 75465830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp entry->magick=(IsImageFormatHandler *) IsPNG; 754708e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 7548d625c5209f3ea468a8494fb5a2a73ac36eead2b5cristy entry->mime_type=ConstantString("image/png"); 75495830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) RegisterMagickInfo(entry); 75505830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 755106b627a07ff44e1ff93ef1288c9f428066ded10ddirk entry=AcquireMagickInfo("PNG","JNG","JPEG Network Graphics"); 755247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 75543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 75553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->decoder=(DecodeImageHandler *) ReadJNGImage; 75563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->encoder=(EncodeImageHandler *) WriteJNGImage; 75573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 75583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 755947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->magick=(IsImageFormatHandler *) IsJNG; 756108e9a113db499034abb5ad8d59b42f8eca3c641cdirk entry->flags^=CoderAdjoinFlag; 75627fee329aec1090ff832c1b07fc4cc70c3b604f65glennrp entry->mime_type=ConstantString("image/x-jng"); 75633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy entry->note=ConstantString(JNGNote); 75643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RegisterMagickInfo(entry); 756547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7566868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 75673d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy ping_semaphore=AcquireSemaphoreInfo(); 756818b17443128598500357da7bff2f01683cf32890cristy#endif 756947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 75703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickImageCoderSignature); 75713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 75723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 75733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 75743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 75753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% U n r e g i s t e r P N G I m a g e % 75793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 75823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 75833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage() removes format registrations made by the 75853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG module from the list of supported formats. 75863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the UnregisterPNGImage method is: 75883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% UnregisterPNGImage(void) 75903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 75913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 75923ed852eea50f9d4cd633efb8c2b054b8e33c253cristyModuleExport void UnregisterPNGImage(void) 75933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 75943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("MNG"); 75953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG"); 75963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG8"); 75973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG24"); 75983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("PNG32"); 7599fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) UnregisterMagickInfo("PNG48"); 7600fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (void) UnregisterMagickInfo("PNG64"); 76015830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp (void) UnregisterMagickInfo("PNG00"); 76023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) UnregisterMagickInfo("JNG"); 760347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7604868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 7605cf002022280cc4dedb2748ad6f415aac1d44f530glennrp if (ping_semaphore != (SemaphoreInfo *) NULL) 76063d162a93f537cb7cbb6d9fa3b8e73e8f992a527acristy RelinquishSemaphoreInfo(&ping_semaphore); 76073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 76083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 76093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_PNG_DELEGATE) 761125c1e2baba76d9cf3ec582f217f96af95259e747glennrp#if PNG_LIBPNG_VER > 10011 76123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 76133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 76143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e M N G I m a g e % 76183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 76213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 76223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteMNGImage() writes an image in the Portable Network Graphics 76243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Group's "Multiple-image Network Graphics" encoded image format. 76253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 76273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteMNGImage method is: 76293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 763016ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteMNGImage(const ImageInfo *image_info, 763116ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 76323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows. 76343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 76363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 76383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 763916ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 76403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% To do (as of version 5.5.2, November 26, 2002 -- glennrp -- see also 76423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "To do" under ReadPNGImage): 76433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Preserve all unknown and not-yet-handled known chunks found in input 76453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG file and copy them into output PNG files according to the PNG 76463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% copying rules. 76473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Write the iCCP chunk at MNG level when (icc profile length > 0) 76493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Improve selection of color type (use indexed-colour or indexed-colour 76513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% with tRNS when 256 or fewer unique RGBA values are present). 76523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Figure out what to do with "dispose=<restore-to-previous>" (dispose == 3) 76543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% This will be complicated if we limit ourselves to generating MNG-LC 76553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% files. For now we ignore disposal method 3 and simply overlay the next 76563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image on it. 76573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical PLTE's or PLTE/tRNS combinations and use a 76593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% global MNG PLTE or PLTE/tRNS combination when appropriate. 76603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% [mostly done 15 June 1999 but still need to take care of tRNS] 76613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sRGB and replace with a global sRGB (and remove 76633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% gAMA/cHRM if sRGB is found; check for identical gAMA/cHRM and 76643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% replace with global gAMA/cHRM (or with sRGB if appropriate; replace 76653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% local gAMA/cHRM with local sRGB if appropriate). 76663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Check for identical sBIT chunks and write global ones. 76683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide option to skip writing the signature tEXt chunks. 76703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use signatures to detect identical objects and reuse the first 76723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instance of such objects instead of writing duplicate objects. 76733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Use a smaller-than-32k value of compression window size when 76753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% appropriate. 76763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Encode JNG datastreams. Mostly done as of 5.5.2; need to write 76783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary text chunks and save profiles. 76793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force LC files (to ensure exact framing rate) 76813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% instead of VLC. 76823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 76833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Provide an option to force VLC files instead of LC, even when offsets 76843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% are present. This will involve expanding the embedded images with a 76853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparent region at the top and/or left. 76863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 76873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void 7689cf002022280cc4dedb2748ad6f415aac1d44f530glennrpMagick_png_write_raw_profile(const ImageInfo *image_info,png_struct *ping, 76903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info *ping_info, unsigned char *profile_type, unsigned char 76913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile_description, unsigned char *profile_data, png_uint_32 length) 76923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 76933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_textp 76943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text; 76953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7696bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 76973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 76983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 76993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 77003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *sp; 77013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_charp 77033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp; 77043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 77063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length, 77073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length; 77083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 77103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy hex[16]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; 77113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleNCompare((char *) profile_type+1, "ng-chunk-",9) == 0) 77133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return; 77143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 77163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) printf("writing raw profile: type=%s, length=%.20g\n", 77180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (char *) profile_type, (double) length); 77193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 77200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 7721ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 7722a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_alloc_size_t) sizeof(png_text)); 7723a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 7724a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); 7725a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 77263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy description_length=(png_uint_32) strlen((const char *) profile_description); 77273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length=(png_uint_32) (length*2 + (length >> 5) + 20 77283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy + description_length); 7729ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 7730a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].text=(png_charp) png_malloc(ping, 7731a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy (png_alloc_size_t) allocated_length); 7732a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].key=(png_charp) png_malloc(ping, (png_alloc_size_t) 80); 7733a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 7734a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].text=(png_charp) png_malloc(ping, (png_size_t) allocated_length); 7735a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text[0].key=(png_charp) png_malloc(ping, (png_size_t) 80); 7736a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 77373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].key[0]='\0'; 77383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key, 7739151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy "Raw profile type ",MagickPathExtent); 77403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ConcatenateMagickString(text[0].key,(const char *) profile_type,62); 77413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy sp=profile_data; 77423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp=text[0].text; 77433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CopyMagickString(dp,(const char *) profile_description, 77453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy allocated_length); 77463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=description_length; 77473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77483b6fd2ec2d9f69f9404445dba0aff5bac02e685ccristy (void) FormatLocaleString(dp,allocated_length- 7749f2faecf9facdbbb14fcba373365f9f691a9658e0cristy (png_size_t) (dp-text[0].text),"%8lu ",(unsigned long) length); 77503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy dp+=8; 775147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7752bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) length; i++) 77533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (i%36 == 0) 77553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp >> 4) & 0x0f)]; 77573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(dp++)=(char) hex[((*sp++ ) & 0x0f)]; 77583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 775947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp++='\n'; 77613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *dp='\0'; 77623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length=(png_size_t) (dp-text[0].text); 77633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].compression=image_info->compression == NoCompression || 77643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->compression == UndefinedCompression && 77653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy text[0].text_length < 128) ? -1 : 0; 776647b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (text[0].text_length <= allocated_length) 77683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_text(ping,ping_info,text,1); 776947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].text); 77713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text[0].key); 77723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_free(ping,text); 77733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 77743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 7775cf002022280cc4dedb2748ad6f415aac1d44f530glennrpstatic MagickBooleanType Magick_png_write_chunk_from_profile(Image *image, 77764383ec8c3c8811128f5a8a034d67c47db5e7e75acristy const char *string, MagickBooleanType logging) 77773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 77783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 77793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name; 77803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 77823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 77833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 77853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *data; 77863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_32 length; 77883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 77893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ResetImageProfileIterator(image); 779047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 779147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 779247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 77933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy profile=GetImageProfile(image,name); 779447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 77953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (profile != (const StringInfo *) NULL) 77963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 77973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy StringInfo 7798cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *ping_profile; 77993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 780047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (LocaleNCompare(name,string,11) == 0) 780147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp { 780247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp if (logging != MagickFalse) 780347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 780447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp " Found %s profile",name); 780547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 7806cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=CloneStringInfo(profile); 7807cf002022280cc4dedb2748ad6f415aac1d44f530glennrp data=GetStringInfoDatum(ping_profile), 7808cf002022280cc4dedb2748ad6f415aac1d44f530glennrp length=(png_uint_32) GetStringInfoLength(ping_profile); 780947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[4]=data[3]; 781047b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[3]=data[2]; 781147b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[2]=data[1]; 781247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp data[1]=data[0]; 781347b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,length-5); /* data length */ 781447b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlob(image,length-1,data+1); 781547b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp (void) WriteBlobMSBULong(image,crc32(0,data+1,(uInt) length-1)); 7816cf002022280cc4dedb2748ad6f415aac1d44f530glennrp ping_profile=DestroyStringInfo(ping_profile); 781747b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp } 78183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 781947b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 78203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy name=GetNextImageProfile(image); 78213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 782247b9dd5e18d5870d82f2a28c6160b32917916ad7glennrp 78233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 78243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 78253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 782668a6b50ae30f5a551cd31d6e4b0c72990897a84fdirkstatic inline MagickBooleanType Magick_png_color_equal(const Image *image, 782768a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk const Quantum *p, const PixelInfo *q) 782868a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk{ 782968a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk MagickRealType 783068a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value; 783168a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 783268a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[RedPixelChannel].offset]; 783368a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->red) >= MagickEpsilon) 783468a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 783568a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[GreenPixelChannel].offset]; 783668a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->green) >= MagickEpsilon) 783768a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 783868a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk value=(MagickRealType) p[image->channel_map[BluePixelChannel].offset]; 783968a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (AbsolutePixelValue(value-q->blue) >= MagickEpsilon) 784068a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickFalse); 784168a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 784268a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk return(MagickTrue); 784368a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk} 784468a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk 7845fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 7846fd6fd07e58e3d37313bec849313ac6e2b92e3957dirkstatic void write_tIME_chunk(Image *image,png_struct *ping,png_info *info, 7847fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk const char *date,ExceptionInfo *exception) 7848fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk{ 7849fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk unsigned int 7850fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk day, 7851fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk hour, 7852fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk minute, 7853fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk month, 7854fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk second, 7855fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk year; 7856fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7857fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_time 7858fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime; 7859fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7860fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time_t 7861fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ttime; 7862fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 7863fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (date != (const char *) NULL) 7864fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7865fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (sscanf(date,"%d-%d-%dT%d:%d:%dZ",&year,&month,&day,&hour,&minute, 7866fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk &second) != 6) 7867fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7868fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 7869fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk "Invalid date format specified for png:tIME","`%s'", 7870fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk image->filename); 7871fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk return; 7872fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7873fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.year=(png_uint_16) year; 7874fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.month=(png_byte) month; 7875fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.day=(png_byte) day; 7876fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.hour=(png_byte) hour; 7877fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.minute=(png_byte) minute; 7878fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ptime.second=(png_byte) second; 7879fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7880fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk else 7881fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 7882fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk time(&ttime); 7883fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_convert_from_time_t(&ptime,ttime); 7884fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 7885fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk png_set_tIME(ping,info,&ptime); 7886fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk} 7887fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 7888b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 7889b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp/* Write one PNG image */ 78903ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOnePNGImage(MngInfo *mng_info, 789116ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *IMimage_info,Image *IMimage,ExceptionInfo *exception) 78923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 78930997332e2c35a821b271d6e7473c01c10dc206adcristy char 78940997332e2c35a821b271d6e7473c01c10dc206adcristy im_vers[32], 78950997332e2c35a821b271d6e7473c01c10dc206adcristy libpng_runv[32], 78960997332e2c35a821b271d6e7473c01c10dc206adcristy libpng_vers[32], 78970997332e2c35a821b271d6e7473c01c10dc206adcristy zlib_runv[32], 78980997332e2c35a821b271d6e7473c01c10dc206adcristy zlib_vers[32]; 78990997332e2c35a821b271d6e7473c01c10dc206adcristy 790016ea139d53d867211d3bb0fa859a83de653f687ecristy Image 790116ea139d53d867211d3bb0fa859a83de653f687ecristy *image; 790216ea139d53d867211d3bb0fa859a83de653f687ecristy 790316ea139d53d867211d3bb0fa859a83de653f687ecristy ImageInfo 790416ea139d53d867211d3bb0fa859a83de653f687ecristy *image_info; 790516ea139d53d867211d3bb0fa859a83de653f687ecristy 79063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy char 79073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy s[2]; 79083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 79103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *name, 79113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *property, 79123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 79133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const StringInfo 79153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *profile; 79163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 79183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes, 7919cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp pass; 7920cecd5765c41f64cc68d4a5d77bb4afe92707a49eglennrp 7921e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp png_byte 7922e9c26dc68fb7cff87adcf2677968737acc9d3d2cglennrp ping_trans_alpha[256]; 79235af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 792439992b4dd9b12ef752d55b8e402c069698851f72glennrp png_color 792539992b4dd9b12ef752d55b8e402c069698851f72glennrp palette[257]; 79263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79275af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_color_16 79285af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background, 79295af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color; 79305af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 79313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_info 79323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping_info; 79333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_struct 79353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *ping; 79363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79375af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp png_uint_32 79385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_height, 79395af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_width; 79405af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 7941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 79423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy y; 79433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 794558e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp image_matte, 794621f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 794758e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp matte, 794858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp 7949da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob, 7950fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency, 7951d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color, 79528d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw, 795339992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE, 7954991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD, 7955918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP, 7956991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs, 7957918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB, 7958991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS, 795926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 796026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_bKGD, 796126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_cHRM, 7962a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date, 7963e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_EXIF, */ 796426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_gAMA, 796526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_iCCP, 796626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* ping_exclude_iTXt, */ 796726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_oFFs, 796826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_pHYs, 796926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_sRGB, 797026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_tEXt, 7971fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_exclude_tIME, 7972e4e2d7916fb10ae2957bc36639b56fa303fd4a0eglennrp /* ping_exclude_tRNS, */ 797326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_vpAg, 797426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zCCP, /* hex-encoded iCCP */ 797526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_exclude_zTXt, 797626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 79778d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap, 7978ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP, 79790e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning, 79800e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 798182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp status, 79828ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332, 7983d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_333, 7984d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444; 79853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79860997332e2c35a821b271d6e7473c01c10dc206adcristy MemoryInfo 7987af1534a4abd2d6ef7f7e2833b95400301faff3d3cristy *volatile pixel_info; 79880997332e2c35a821b271d6e7473c01c10dc206adcristy 79893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy QuantumInfo 79903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *quantum_info; 79913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 799216ea139d53d867211d3bb0fa859a83de653f687ecristy PNGErrorInfo 799316ea139d53d867211d3bb0fa859a83de653f687ecristy error_info; 799416ea139d53d867211d3bb0fa859a83de653f687ecristy 7995bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 79963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i, 79973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x; 79983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 79993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 80000997332e2c35a821b271d6e7473c01c10dc206adcristy *ping_pixels; 8001d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 80025af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp volatile int 8003f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors, 80040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth, 80055af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type, 80065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method, 80075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method, 80085af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method, 80095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans; 80105af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 8011bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 80125af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth, 80135af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp old_bit_depth; 80143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8015bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 80163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quality, 80173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes, 80183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth; 80193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 8020dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp int 8021fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp j, 8022f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, 80238bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque, 80248bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent, 80258bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent, 8026dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type; 8027dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 8028dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp png_uint_32 8029dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution, 8030dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution; 8031dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 80323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 8033fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOnePNGImage()"); 80343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 803516ea139d53d867211d3bb0fa859a83de653f687ecristy image = CloneImage(IMimage,0,0,MagickFalse,exception); 803616ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=(ImageInfo *) CloneImageInfo(IMimage_info); 803716ea139d53d867211d3bb0fa859a83de653f687ecristy if (image_info == (ImageInfo *) NULL) 803816ea139d53d867211d3bb0fa859a83de653f687ecristy ThrowWriterException(ResourceLimitError, "MemoryAllocationFailed"); 8039b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 8040d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp /* Define these outside of the following "if logging()" block so they will 8041d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp * show in debuggers. 8042d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp */ 8043d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *im_vers='\0'; 8044d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 8045151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickLibVersionText,MagickPathExtent); 8046d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(im_vers, 8047151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy MagickLibAddendum,MagickPathExtent); 8048ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 8049d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *libpng_vers='\0'; 8050d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(libpng_vers, 8051ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp PNG_LIBPNG_VER_STRING,32); 8052ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *libpng_runv='\0'; 8053ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(libpng_runv, 8054ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp png_get_libpng_ver(NULL),32); 8055ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 8056d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp *zlib_vers='\0'; 8057d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp (void) ConcatenateMagickString(zlib_vers, 8058ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp ZLIB_VERSION,32); 8059ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp *zlib_runv='\0'; 8060ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp (void) ConcatenateMagickString(zlib_runv, 8061ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_version,32); 8062ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp 80638fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 8064d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp { 8065d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," IM version = %s", 8066d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp im_vers); 8067d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," Libpng version = %s", 8068d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp libpng_vers); 8069ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp if (LocaleCompare(libpng_vers,libpng_runv) != 0) 8070ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp { 8071ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 8072ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp libpng_runv); 8073ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp } 8074d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp LogMagickEvent(CoderEvent,GetMagickModule()," Zlib version = %s", 8075d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp zlib_vers); 8076ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp if (LocaleCompare(zlib_vers,zlib_runv) != 0) 8077ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp { 8078ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp LogMagickEvent(CoderEvent,GetMagickModule()," running with %s", 8079ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp zlib_runv); 8080ec0ddbc89d50eda4c550fb76c06d6b7dccd147acglennrp } 8081d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp } 8082d0cae2599e87ce432f40fd50ad66439f4281ee64glennrp 80835af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp /* Initialize some stuff */ 80840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=0, 80855af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=0, 80865af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_interlace_method=0, 80875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_compression_method=0, 80885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_filter_method=0, 80895af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans = 0; 80905af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 80915af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.red = 0; 80925af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.green = 0; 80935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.blue = 0; 80945af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.gray = 0; 80955af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_background.index = 0; 80965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 80975af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red=0; 80985af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green=0; 80995af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue=0; 81005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray=0; 81015af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 8102dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type = 0; 8103dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_x_resolution = 0; 8104dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_y_resolution = 0; 8105dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 8106da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickFalse; 8107f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp ping_have_cheap_transparency=MagickFalse; 8108d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_color=MagickTrue; 81098d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw=MagickTrue; 811039992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickFalse; 8111991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD=MagickFalse; 8112918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP=MagickFalse; 8113991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs=MagickFalse; 8114918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB=MagickFalse; 8115991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_tRNS=MagickFalse; 8116991d11dd9c33e65872778b81aff1347cd2878154glennrp 81170e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_bKGD=mng_info->ping_exclude_bKGD; 81180e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_cHRM=mng_info->ping_exclude_cHRM; 8119a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp ping_exclude_date=mng_info->ping_exclude_date; 8120dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_EXIF=mng_info->ping_exclude_EXIF; */ 81210e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_gAMA=mng_info->ping_exclude_gAMA; 81220e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_iCCP=mng_info->ping_exclude_iCCP; 81230e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* ping_exclude_iTXt=mng_info->ping_exclude_iTXt; */ 81240e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_oFFs=mng_info->ping_exclude_oFFs; 81250e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_pHYs=mng_info->ping_exclude_pHYs; 81260e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_sRGB=mng_info->ping_exclude_sRGB; 81270e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_tEXt=mng_info->ping_exclude_tEXt; 8128fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk ping_exclude_tIME=mng_info->ping_exclude_tIME; 8129dde35db6e37a8fd3adaa19bdfe20c7a54b2085efglennrp /* ping_exclude_tRNS=mng_info->ping_exclude_tRNS; */ 81300e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_vpAg=mng_info->ping_exclude_vpAg; 81310e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zCCP=mng_info->ping_exclude_zCCP; /* hex-encoded iCCP in zTXt */ 81320e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_exclude_zTXt=mng_info->ping_exclude_zTXt; 81330e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 81348d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp ping_preserve_colormap = mng_info->ping_preserve_colormap; 8135ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_preserve_iCCP = mng_info->ping_preserve_iCCP; 81360e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning = MagickFalse; 81370e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 81380d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Recognize the ICC sRGB profile and convert it to the sRGB chunk, 81390d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * i.e., eliminate the ICC profile and set image->rendering_intent. 81400d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * Note that this will not involve any changes to the actual pixels 81410d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * but merely passes information to applications that read the resulting 81420d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy * PNG image. 8143ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8144ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * To do: recognize other variants of the sRGB profile, using the CRC to 8145ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * verify all recognized variants including the 7 already known. 8146ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8147ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Work around libpng16+ rejecting some "known invalid sRGB profiles". 8148ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8149ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Use something other than image->rendering_intent to record the fact 8150ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * that the sRGB profile was found. 8151ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * 8152ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * Record the ICC version (currently v2 or v4) of the incoming sRGB ICC 8153ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp * profile. Record the Blackpoint Compensation, if any. 81540d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy */ 8155ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (ping_exclude_sRGB == MagickFalse && ping_preserve_iCCP == MagickFalse) 81560d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81570d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy char 81580d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *name; 81590d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81600d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy const StringInfo 81610d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy *profile; 81620d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81630d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ResetImageProfileIterator(image); 81640d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 81650d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81660d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy profile=GetImageProfile(image,name); 81670d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81680d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (profile != (StringInfo *) NULL) 81690d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 81700d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((LocaleCompare(name,"ICC") == 0) || 8171ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (LocaleCompare(name,"ICM") == 0)) 8172ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 8173ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8174ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp int 8175ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp icheck, 8176ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc=0; 81770d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 81780d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8179ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp png_uint_32 8180ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length, 8181ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=0; 818229a106ed9ec29e243521b0f2a26c14281de8347fglennrp 8183ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp unsigned char 8184ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp *data; 81850d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8186ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp length=(png_uint_32) GetStringInfoLength(profile); 818729a106ed9ec29e243521b0f2a26c14281de8347fglennrp 8188ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp for (icheck=0; sRGB_info[icheck].len > 0; icheck++) 818929a106ed9ec29e243521b0f2a26c14281de8347fglennrp { 8190ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (length == sRGB_info[icheck].len) 8191ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 8192ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (got_crc == 0) 8193ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8194ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8195ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp " Got a %lu-byte ICC profile (potentially sRGB)", 8196ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (unsigned long) length); 81970d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8198ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp data=GetStringInfoDatum(profile); 8199ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp profile_crc=crc32(0,data,length); 82000d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 8201ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8202ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " with crc=%8x",(unsigned int) profile_crc); 8203ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp got_crc++; 8204ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 8205ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp 8206ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (profile_crc == sRGB_info[icheck].crc) 8207ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp { 8208ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8209ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " It is sRGB with rendering intent = %s", 8210ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntentString_from_PNG_RenderingIntent( 8211ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent)); 8212ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp if (image->rendering_intent==UndefinedIntent) 8213ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp { 8214ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp image->rendering_intent= 8215ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp Magick_RenderingIntent_from_PNG_RenderingIntent( 8216ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp sRGB_info[icheck].intent); 8217ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp } 8218ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_exclude_iCCP = MagickTrue; 8219ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_exclude_zCCP = MagickTrue; 8220ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_sRGB = MagickTrue; 8221ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp break; 8222ee7b4c0ec5013e84a2ab2e0fe9c4beaed4b75606glennrp } 822329a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 82240d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 8225ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (sRGB_info[icheck].len == 0) 822629a106ed9ec29e243521b0f2a26c14281de8347fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8227ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Got a %lu-byte ICC profile not recognized as sRGB", 822829a106ed9ec29e243521b0f2a26c14281de8347fglennrp (unsigned long) length); 822929a106ed9ec29e243521b0f2a26c14281de8347fglennrp } 82300d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82310d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy name=GetNextImageProfile(image); 82320d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82330d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 82340d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy 82358bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_opaque = 0; 82368bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent = 0; 82378bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_transparent = 0; 82388bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 8239fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 8240fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 8241fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == UndefinedClass) 8242fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8243f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=UndefinedClass"); 8244fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == DirectClass) 8245fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8246f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=DirectClass"); 8247fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass) 8248fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8249f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp " image->storage_class=PseudoClass"); 8250f3794ae8cfb6e17f5161c2ecfe15a29fba5ece80glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), image->taint ? 8251cc96f2d3d09f91c9333d05e2e7216d4006f8a5eaglennrp " image->taint=MagickTrue": 8252cc96f2d3d09f91c9333d05e2e7216d4006f8a5eaglennrp " image->taint=MagickFalse"); 8253fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 825428af3713c9111a471cc868c787760de89236fa3cglennrp 8255750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp if (image->storage_class == PseudoClass && 82567e65e93c71716f2a5c03c0808adedae21d519fb2glennrp (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32 || 8257fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || mng_info->write_png64 || 8258fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (mng_info->write_png_colortype != 1 && 8259fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype != 5))) 82607e65e93c71716f2a5c03c0808adedae21d519fb2glennrp { 826116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 82627e65e93c71716f2a5c03c0808adedae21d519fb2glennrp image->storage_class = DirectClass; 82637e65e93c71716f2a5c03c0808adedae21d519fb2glennrp } 82647e65e93c71716f2a5c03c0808adedae21d519fb2glennrp 8265c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (ping_preserve_colormap == MagickFalse) 826628af3713c9111a471cc868c787760de89236fa3cglennrp { 8267c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (image->storage_class != PseudoClass && image->colormap != NULL) 8268c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8269c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp /* Free the bogus colormap; it can cause trouble later */ 8270c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8271c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8272c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Freeing bogus colormap"); 8273e9ac4c3545df599381509bfa2a60d58971d3c5b8cristy (void) RelinquishMagickMemory(image->colormap); 8274c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp image->colormap=NULL; 8275c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 827628af3713c9111a471cc868c787760de89236fa3cglennrp } 8277bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8278c28acd632b7ea1724a54191d15db932f2e4d25e6glennrp if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) 827916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) TransformImageColorspace(image,sRGBColorspace,exception); 82800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 82813241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp /* 82823241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp Sometimes we get PseudoClass images whose RGB values don't match 82833241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp the colors in the colormap. This code syncs the RGB values. 82843241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp */ 82853241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp if (image->depth <= 8 && image->taint && image->storage_class == PseudoClass) 828616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 82873241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8288a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#if (MAGICKCORE_QUANTUM_DEPTH == 8) 8289a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (image->depth > 8) 8290a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp { 8291a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp if (logging != MagickFalse) 8292a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8293a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp " Reducing PNG bit depth to 8 since this is a Q8 build."); 8294a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8295a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp image->depth=8; 8296a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp } 8297a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp#endif 8298a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 82998e58efdecda887b08ef730d68290a61081ef2566glennrp /* Respect the -depth option */ 8300cd979955e4249aab3bdd79043718fa3b120239b8dirk if (image->depth < 4) 830167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp { 830216ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 83038e58efdecda887b08ef730d68290a61081ef2566glennrp *r; 83048e58efdecda887b08ef730d68290a61081ef2566glennrp 8305aac49630945ded4a68aca4f7c892e18b21afeba8dirk if (image->depth > 2) 83068e58efdecda887b08ef730d68290a61081ef2566glennrp { 83078e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 4-bit */ 830891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->background_color); 83098e58efdecda887b08ef730d68290a61081ef2566glennrp 83108e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 83118e58efdecda887b08ef730d68290a61081ef2566glennrp { 831216ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83138e58efdecda887b08ef730d68290a61081ef2566glennrp 831416ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83158e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83168e58efdecda887b08ef730d68290a61081ef2566glennrp 83178e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83188e58efdecda887b08ef730d68290a61081ef2566glennrp { 831916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR04PixelRGBA(r); 832016ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83218e58efdecda887b08ef730d68290a61081ef2566glennrp } 8322bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83238e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83248e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83258e58efdecda887b08ef730d68290a61081ef2566glennrp } 83268e58efdecda887b08ef730d68290a61081ef2566glennrp 83278e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83288e58efdecda887b08ef730d68290a61081ef2566glennrp { 83293e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83308e58efdecda887b08ef730d68290a61081ef2566glennrp { 833191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGBO(image->colormap[i]); 83328e58efdecda887b08ef730d68290a61081ef2566glennrp } 83338e58efdecda887b08ef730d68290a61081ef2566glennrp } 83348e58efdecda887b08ef730d68290a61081ef2566glennrp } 83358e58efdecda887b08ef730d68290a61081ef2566glennrp else if (image->depth > 1) 83368e58efdecda887b08ef730d68290a61081ef2566glennrp { 83378e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 2-bit */ 833891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->background_color); 83398e58efdecda887b08ef730d68290a61081ef2566glennrp 83408e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 83418e58efdecda887b08ef730d68290a61081ef2566glennrp { 834216ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83438e58efdecda887b08ef730d68290a61081ef2566glennrp 834416ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83458e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83468e58efdecda887b08ef730d68290a61081ef2566glennrp 83478e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83488e58efdecda887b08ef730d68290a61081ef2566glennrp { 834916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR02PixelRGBA(r); 835016ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83518e58efdecda887b08ef730d68290a61081ef2566glennrp } 8352bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83538e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83548e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83558e58efdecda887b08ef730d68290a61081ef2566glennrp } 83568e58efdecda887b08ef730d68290a61081ef2566glennrp 83578e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83588e58efdecda887b08ef730d68290a61081ef2566glennrp { 83593e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83608e58efdecda887b08ef730d68290a61081ef2566glennrp { 836191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketRGBO(image->colormap[i]); 83628e58efdecda887b08ef730d68290a61081ef2566glennrp } 83638e58efdecda887b08ef730d68290a61081ef2566glennrp } 83648e58efdecda887b08ef730d68290a61081ef2566glennrp } 83658e58efdecda887b08ef730d68290a61081ef2566glennrp else 83668e58efdecda887b08ef730d68290a61081ef2566glennrp { 83678e58efdecda887b08ef730d68290a61081ef2566glennrp /* Scale to 1-bit */ 836891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->background_color); 83698e58efdecda887b08ef730d68290a61081ef2566glennrp 83708e58efdecda887b08ef730d68290a61081ef2566glennrp for (y=0; y < (ssize_t) image->rows; y++) 83718e58efdecda887b08ef730d68290a61081ef2566glennrp { 837216ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 83738e58efdecda887b08ef730d68290a61081ef2566glennrp 837416ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 83758e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83768e58efdecda887b08ef730d68290a61081ef2566glennrp 83778e58efdecda887b08ef730d68290a61081ef2566glennrp for (x=0; x < (ssize_t) image->columns; x++) 83788e58efdecda887b08ef730d68290a61081ef2566glennrp { 837916ea139d53d867211d3bb0fa859a83de653f687ecristy LBR01PixelRGBA(r); 838016ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 83818e58efdecda887b08ef730d68290a61081ef2566glennrp } 8382bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 83838e58efdecda887b08ef730d68290a61081ef2566glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 83848e58efdecda887b08ef730d68290a61081ef2566glennrp break; 83858e58efdecda887b08ef730d68290a61081ef2566glennrp } 83868e58efdecda887b08ef730d68290a61081ef2566glennrp 83878e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 83888e58efdecda887b08ef730d68290a61081ef2566glennrp { 83893e08f1130848df134cab76223cc758607d25efa7cristy for (i=0; i < (ssize_t) image->colors; i++) 83908e58efdecda887b08ef730d68290a61081ef2566glennrp { 839191d99255dd77083750426ba5463e002a586bc9a6glennrp LBR01PacketRGBO(image->colormap[i]); 83928e58efdecda887b08ef730d68290a61081ef2566glennrp } 83938e58efdecda887b08ef730d68290a61081ef2566glennrp } 83948e58efdecda887b08ef730d68290a61081ef2566glennrp } 8395cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp } 8396cc95c3f37f025a52b71d927cba8009c4f8bc83a5glennrp 839767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* To do: set to next higher multiple of 8 */ 839867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->depth < 8) 839970e68a844517efda3094dc170a8f54affc9c82bcglennrp image->depth=8; 8400a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 84012b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 16) 84022b013e4b9b602533eff410e61c3683fb2a3ab913glennrp /* PNG does not handle depths greater than 16 so reduce it even 84032b013e4b9b602533eff410e61c3683fb2a3ab913glennrp * if lossy 84042b013e4b9b602533eff410e61c3683fb2a3ab913glennrp */ 84058e58efdecda887b08ef730d68290a61081ef2566glennrp if (image->depth > 8) 84062b013e4b9b602533eff410e61c3683fb2a3ab913glennrp image->depth=16; 84072b013e4b9b602533eff410e61c3683fb2a3ab913glennrp#endif 84082b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 84093faa9a3fb01696daaf976d595f492cb530bffb21glennrp#if (MAGICKCORE_QUANTUM_DEPTH > 8) 8410cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp if (image->depth > 8) 8411cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp { 8412cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* To do: fill low byte properly */ 8413cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp image->depth=16; 8414cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp } 8415cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 8416c722dd852e8abe407c2846d39662f7ade9c234deglennrp if (image->depth == 16 && mng_info->write_png_depth != 16) 841716ea139d53d867211d3bb0fa859a83de653f687ecristy if (mng_info->write_png8 || LosslessReduceDepthOK(image,exception) != MagickFalse) 84188640fb5e9b1094f35f8beab436f81661b8a99448glennrp image->depth = 8; 84198640fb5e9b1094f35f8beab436f81661b8a99448glennrp#endif 84208640fb5e9b1094f35f8beab436f81661b8a99448glennrp 8421d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp image_colors = (int) image->colors; 8422d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_opaque = (int) image->colors; 8423d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_transparent = 0; 8424d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp number_semitransparent = 0; 8425d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp 8426197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp if (mng_info->write_png_colortype && 8427a8036d6466b63ead629795b60772f160cca77c4cglennrp (mng_info->write_png_colortype > 4 || (mng_info->write_png_depth >= 8 && 8428a8036d6466b63ead629795b60772f160cca77c4cglennrp mng_info->write_png_colortype < 4 && 842917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy image->alpha_trait == UndefinedPixelTrait))) 8430a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8431a8036d6466b63ead629795b60772f160cca77c4cglennrp /* Avoid the expensive BUILD_PALETTE operation if we're sure that we 8432a8036d6466b63ead629795b60772f160cca77c4cglennrp * are not going to need the result. 8433a8036d6466b63ead629795b60772f160cca77c4cglennrp */ 8434a8036d6466b63ead629795b60772f160cca77c4cglennrp if (mng_info->write_png_colortype == 1 || 8435a8036d6466b63ead629795b60772f160cca77c4cglennrp mng_info->write_png_colortype == 5) 8436a8036d6466b63ead629795b60772f160cca77c4cglennrp ping_have_color=MagickFalse; 8437a8036d6466b63ead629795b60772f160cca77c4cglennrp 843817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 8439a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8440a8036d6466b63ead629795b60772f160cca77c4cglennrp number_transparent = 2; 8441a8036d6466b63ead629795b60772f160cca77c4cglennrp number_semitransparent = 1; 8442a8036d6466b63ead629795b60772f160cca77c4cglennrp } 8443a8036d6466b63ead629795b60772f160cca77c4cglennrp } 8444a8036d6466b63ead629795b60772f160cca77c4cglennrp 8445eb5cb8dae42f21ec99df00cae387c3308aba18e6glennrp if (mng_info->write_png_colortype < 7) 8446a8036d6466b63ead629795b60772f160cca77c4cglennrp { 8447a8036d6466b63ead629795b60772f160cca77c4cglennrp /* BUILD_PALETTE 8448a8036d6466b63ead629795b60772f160cca77c4cglennrp * 8449a8036d6466b63ead629795b60772f160cca77c4cglennrp * Normally we run this just once, but in the case of writing PNG8 8450e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * we reduce the transparency to binary and run again, then if there 8451e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * are still too many colors we reduce to a simple 4-4-4-1, then 3-3-3-1 84528ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * RGBA palette and run again, and then to a simple 3-3-2-1 RGBA 84538ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * palette. Then (To do) we take care of a final reduction that is only 84548ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * needed if there are still 256 colors present and one of them has both 84558ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * transparent and opaque instances. 8456c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 845782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 84588ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickFalse; 845982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickFalse; 8460d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickFalse; 846182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 84628ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (j=0; j<6; j++) 8463d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8464a8036d6466b63ead629795b60772f160cca77c4cglennrp /* 8465d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get DirectClass images that have 256 colors or fewer. 8466d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will build a colormap. 8467d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8468d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also, sometimes we get PseudoClass images with an out-of-date 8469d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * colormap. This code will replace the colormap with a new one. 8470d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Sometimes we get PseudoClass images that have more than 256 colors. 8471d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * This code will delete the colormap and change the image to 8472d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * DirectClass. 8473d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 84748a46d827a124555f0c48fb2368ec1bba8e079ab6cristy * If image->alpha_trait is MagickFalse, we ignore the alpha channel 8475d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * even though it sometimes contains left-over non-opaque values. 8476d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8477d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Also we gather some information (number of opaque, transparent, 8478d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * and semitransparent pixels, and whether the image has any non-gray 8479d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixels or only black-and-white pixels) that we might need later. 8480d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * 8481d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Even if the user wants to force GrayAlpha or RGBA (colortype 4 or 6) 8482d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * we need to check for bogus non-opaque values, at least. 8483d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 84843c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8485d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp int 8486d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n; 84878bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 848816ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8489d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp opaque[260], 8490d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp semitransparent[260], 8491d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp transparent[260]; 84928bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 849316ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 849416ea139d53d867211d3bb0fa859a83de653f687ecristy *s; 8495d6bf1617e99df0272b231855a933a74e99b6578fglennrp 849616ea139d53d867211d3bb0fa859a83de653f687ecristy register Quantum 849716ea139d53d867211d3bb0fa859a83de653f687ecristy *q, 8498fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *r; 8499fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8500d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8501d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8502d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Enter BUILD_PALETTE:"); 8503d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8504d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8505d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8506d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8507d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->columns=%.20g",(double) image->columns); 8508d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8509d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->rows=%.20g",(double) image->rows); 8510d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85118a46d827a124555f0c48fb2368ec1bba8e079ab6cristy " image->alpha_trait=%.20g",(double) image->alpha_trait); 851203812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8513d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->depth=%.20g",(double) image->depth); 85143c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8515fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image->storage_class == PseudoClass && image->colormap != NULL) 85167ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 85177ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8518d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Original colormap:"); 85198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 852016ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 85212cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8522d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < 256; i++) 85237ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp { 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); 85317ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp } 85322cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8533d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=image->colors - 10; i < (ssize_t) image->colors; i++) 8534d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8535d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i > 255) 8536d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8537d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8538d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8539d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8540d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8541d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8542d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 854316ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8544d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8545d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8546d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85472cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8548d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8549d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d",(int) image->colors); 855083c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8551d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colors == 0) 855216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 855316ea139d53d867211d3bb0fa859a83de653f687ecristy " (zero means unknown)"); 85547ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 85558d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap == MagickFalse) 85568d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 85578d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp " Regenerate the colormap"); 8558d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85597ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 8560d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=0; 8561fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_opaque = 0; 8562fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_semitransparent = 0; 8563fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp number_transparent = 0; 85642cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8565d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8566d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8567d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 85687ddcc22478e0199aa11e9aeab088874b3b2cef63glennrp 856916ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8570d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 857197fd3d052fbd2e629d5d2387f26de9e250dd3e32glennrp 8572d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8573d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 857417f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait == UndefinedPixelTrait || 857516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,q) == OpaqueAlpha) 85768d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8577d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259) 85788d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8579d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque == 0) 8580d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 858116ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque); 858216ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[0].alpha=OpaqueAlpha; 8583d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque=1; 8584d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8585d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8586d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_opaque; i++) 8587d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 858868a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,opaque+i)) 8589d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8590d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8591d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 859216ea139d53d867211d3bb0fa859a83de653f687ecristy if (i == (ssize_t) number_opaque && number_opaque < 259) 8593d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8594d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque++; 859516ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, opaque+i); 859616ea139d53d867211d3bb0fa859a83de653f687ecristy opaque[i].alpha=OpaqueAlpha; 8597d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 85988d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 85998d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 860016ea139d53d867211d3bb0fa859a83de653f687ecristy else if (GetPixelAlpha(image,q) == TransparentAlpha) 86018d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8602d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 259) 86038d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp { 8604d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent == 0) 8605d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 860616ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, transparent); 860716ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red=(unsigned short) 860816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,q); 860916ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green=(unsigned short) 861016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelGreen(image,q); 861116ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue=(unsigned short) 861216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelBlue(image,q); 861316ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.gray=(unsigned short) 8614972d1c4895c4ee6da1b6745e1bb9cb71ee5d6d08cristy GetPixelGray(image,q); 8615d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent = 1; 8616d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8617d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8618d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_transparent; i++) 8619d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 862068a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,transparent+i)) 8621d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8622d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8623d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8624d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_transparent && 8625d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent < 259) 8626d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8627d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent++; 862816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,transparent+i); 8629d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86308d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 86318d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp } 8632d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8633d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8634d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 259) 8635d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8636d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent == 0) 8637d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 863816ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image,q,semitransparent); 8639d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent = 1; 8640d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86418d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 8642d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) number_semitransparent; i++) 8643d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 864468a6b50ae30f5a551cd31d6e4b0c72990897a84fdirk if (Magick_png_color_equal(image,q,semitransparent+i) 864516ea139d53d867211d3bb0fa859a83de653f687ecristy && GetPixelAlpha(image,q) == 864616ea139d53d867211d3bb0fa859a83de653f687ecristy semitransparent[i].alpha) 8647d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8648d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8649d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8650d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (i == (ssize_t) number_semitransparent && 8651d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent < 259) 8652d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8653d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent++; 865416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelInfoPixel(image, q, semitransparent+i); 8655d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8656d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86578bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 865816ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8659d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8660d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86613c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 86624054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png8 == MagickFalse && 86634054bfbdca478fe065f01d7f8285f7c173ccfcfccristy ping_exclude_bKGD == MagickFalse) 8664d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8665d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Add the background color to the palette, if it 8666d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * isn't already there. 8667d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8668c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8669c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8670c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8671c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Check colormap for background (%d,%d,%d)", 8672c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.red, 8673c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.green, 8674c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) image->background_color.blue); 8675c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8676d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8677d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8678ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp if (opaque[i].red == image->background_color.red && 8679ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].green == image->background_color.green && 8680ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp opaque[i].blue == image->background_color.blue) 8681ca7ad3a4c4d394b32265e215c857b485fb57296fglennrp break; 8682d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8683d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 259 && i == number_opaque) 868403812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 86858e045c8f9e00ec89df5b20bf07c059d60e7aaa77glennrp opaque[i] = image->background_color; 8686c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index = i; 8687388a8c871db8f82488f34c4f41fc64a58b8cfbf7glennrp number_opaque++; 8688c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 8689c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 8690c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8691c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d",(int) i); 8692c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 8693c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 869403812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 8695a080bc32a4a8b2ffec83fd836a28753959175363glennrp else if (logging != MagickFalse) 8696a080bc32a4a8b2ffec83fd836a28753959175363glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8697a080bc32a4a8b2ffec83fd836a28753959175363glennrp " No room in the colormap to add background color"); 8698d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 86992cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8700d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors=number_opaque+number_transparent+number_semitransparent; 87013241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8702d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8703d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8704d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors > 256) 8705d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8706d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has more than 256 colors"); 87073241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8708d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8709d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8710d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image has %d colors",image_colors); 8711d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 87123241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 87138d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (ping_preserve_colormap != MagickFalse) 87148d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp break; 87158d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 8716fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (mng_info->write_png_colortype != 7) /* We won't need this info */ 8717d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8718d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickFalse; 87190fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp ping_have_non_bw=MagickFalse; 87200fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp 872145d4c34ce93ff377b9671844ffa1153b821061f6glennrp if (IssRGBCompatibleColorspace(image->colorspace) == MagickFalse) 87220fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp { 872396bc620815234aaec28b928df51d1754cbe390dcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 872496bc620815234aaec28b928df51d1754cbe390dcglennrp "incompatible colorspace"); 87257fb2652ba366fc984d1dbb0c66560b91c57dab78cristy ping_have_color=MagickTrue; 872698b95773e388844e22c6e4006bb88396b33cf6b4glennrp ping_have_non_bw=MagickTrue; 87270fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp } 87280fa2580a52ea729dca17269f8c2b17f93ff263d6glennrp 8729d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if(image_colors > 256) 8730d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8731d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8732d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8733d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 87346185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 873516ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8736d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 87376185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8738e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp s=q; 8739e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp for (x=0; x < (ssize_t) image->columns; x++) 8740e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 874116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != GetPixelGreen(image,s) || 874216ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != GetPixelBlue(image,s)) 8743e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp { 8744e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_color=MagickTrue; 8745e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp ping_have_non_bw=MagickTrue; 8746e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8747e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 874816ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8749e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8750e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8751e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp if (ping_have_color != MagickFalse) 8752e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8753e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp 8754d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Worst case is black-and-white; we are looking at every 8755d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * pixel twice. 8756d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 87576185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8758d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8759d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8760d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp s=q; 8761d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 87626185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 876316ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelRed(image,s) != 0 && 876416ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelRed(image,s) != QuantumRange) 8765d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8766d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8767e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp break; 8768d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 876916ea139d53d867211d3bb0fa859a83de653f687ecristy s+=GetPixelChannels(image); 8770d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8771e5e6b80f72d72eb8dc5be1bd1425b4ad504f0ef7glennrp } 8772d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8773bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 8774bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp } 87754f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 8776d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image_colors < 257) 8777d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 877816ea139d53d867211d3bb0fa859a83de653f687ecristy PixelInfo 8779d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[260]; 8780bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8781d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* 8782d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * Initialize image colormap. 8783d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8784d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8785d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8786d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8787d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Sort the new colormap"); 8788d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8789d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* Sort palette, transparent first */; 8790d6bf1617e99df0272b231855a933a74e99b6578fglennrp 8791d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp n = 0; 87923241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8793d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_transparent; i++) 8794d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = transparent[i]; 87953241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8796d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_semitransparent; i++) 8797d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = semitransparent[i]; 8798d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8799d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<number_opaque; i++) 8800d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[n++] = opaque[i]; 8801d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8802c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.index += 8803c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (number_transparent + number_semitransparent); 8804bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8805d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp /* image_colors < 257; search the colormap instead of the pixels 8806d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp * to get ping_have_color and ping_have_non_bw 8807d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp */ 8808d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i<n; i++) 8809d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8810d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_color == MagickFalse) 8811d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8812d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != colormap[i].green || 8813d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp colormap[i].red != colormap[i].blue) 8814d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8815d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_color=MagickTrue; 8816d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8817d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8818d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8819d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8820d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8821d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8822d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8823d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (colormap[i].red != 0 && colormap[i].red != QuantumRange) 8824d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp ping_have_non_bw=MagickTrue; 8825d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8826d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 88273241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp 8828d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if ((mng_info->ping_exclude_tRNS == MagickFalse || 8829d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (number_transparent == 0 && number_semitransparent == 0)) && 8830d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (((mng_info->write_png_colortype-1) == 8831d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp PNG_COLOR_TYPE_PALETTE) || 8832d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (mng_info->write_png_colortype == 0))) 8833d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8834d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 88356185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 8836d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (n != (ssize_t) image_colors) 8837d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8838d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image_colors (%d) and n (%d) don't match", 8839d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image_colors, n); 88402cc891a179d622dde7bbb8854138851e828bc6eaglennrp 8841d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8842d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " AcquireImageColormap"); 8843d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8844d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8845d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colors = image_colors; 8846d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 884716ea139d53d867211d3bb0fa859a83de653f687ecristy if (AcquireImageColormap(image,image_colors,exception) == 8848d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp MagickFalse) 88493faa9a3fb01696daaf976d595f492cb530bffb21glennrp ThrowWriterException(ResourceLimitError, 88503faa9a3fb01696daaf976d595f492cb530bffb21glennrp "MemoryAllocationFailed"); 8851d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8852d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 8853d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp image->colormap[i] = colormap[i]; 8854d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8855d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8856d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8857d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8858d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d (%d)", 8859d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colors, image_colors); 8860bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 8861d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8862d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " Update the pixel indexes"); 8863d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8864d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8865fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* Sync the pixel indices with the new colormap */ 8866fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8867d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (y=0; y < (ssize_t) image->rows; y++) 8868d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 886916ea139d53d867211d3bb0fa859a83de653f687ecristy q=GetAuthenticPixels(image,0,y,image->columns,1,exception); 88703c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 887116ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 8872d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 88733c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8874d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (x=0; x < (ssize_t) image->columns; x++) 8875d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8876d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i< (ssize_t) image_colors; i++) 887703812ae402fb53d548f0e1d7d14720768f803c2dglennrp { 887817f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((image->alpha_trait == UndefinedPixelTrait || 887916ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha == GetPixelAlpha(image,q)) && 888016ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red == GetPixelRed(image,q) && 888116ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green == GetPixelGreen(image,q) && 888216ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue == GetPixelBlue(image,q)) 88836185c5395ac23a4c51586d671ec3e0ba9c126349glennrp { 888416ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelIndex(image,i,q); 8885d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 88866185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 888703812ae402fb53d548f0e1d7d14720768f803c2dglennrp } 888816ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 8889d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8890d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8891d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 8892d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp break; 8893d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8894d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8895d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 8896d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8897d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse) 8898d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8899d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8900d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " image->colors=%d", (int) image->colors); 8901d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8902d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (image->colormap != NULL) 8903d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8904d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 890516ea139d53d867211d3bb0fa859a83de653f687ecristy " i (red,green,blue,alpha)"); 890683c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 8907d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp for (i=0; i < (ssize_t) image->colors; i++) 8908d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 890972988485e53441bbc7e5e7fbcb8e81012212efb6cristy if (i < 300 || i >= (ssize_t) image->colors - 10) 8910d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp { 8911d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8912d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " %d (%d,%d,%d,%d)", 8913d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) i, 8914d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].red, 8915d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].green, 8916d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (int) image->colormap[i].blue, 891716ea139d53d867211d3bb0fa859a83de653f687ecristy (int) image->colormap[i].alpha); 8918d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 89196185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 89206185c5395ac23a4c51586d671ec3e0ba9c126349glennrp } 89213c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8922d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_transparent < 257) 8923d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8924d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent = %d", 8925d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_transparent); 8926d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 89273c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8928d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8929d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_transparent > 256"); 89303c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8931d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_opaque < 257) 8932d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8933d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque = %d", 8934d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_opaque); 893503812ae402fb53d548f0e1d7d14720768f803c2dglennrp 8936d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8937d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8938d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_opaque > 256"); 89396185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8940d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (number_semitransparent < 257) 8941d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8942d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent = %d", 8943d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp number_semitransparent); 89446185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 8945d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8946d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8947d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " number_semitransparent > 256"); 8948a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8949d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (ping_have_non_bw == MagickFalse) 8950d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8951d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are black or white"); 8952a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 8953d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else if (ping_have_color == MagickFalse) 8954d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8955d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " All pixels and the background are gray"); 8956d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp 8957d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp else 8958d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8959d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp " At least one pixel or the background is non-gray"); 89606185c5395ac23a4c51586d671ec3e0ba9c126349glennrp 896103812ae402fb53d548f0e1d7d14720768f803c2dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 896203812ae402fb53d548f0e1d7d14720768f803c2dglennrp " Exit BUILD_PALETTE:"); 8963d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp } 89643c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 8965c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (mng_info->write_png8 == MagickFalse) 8966c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8967fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8968c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* Make any reductions necessary for the PNG8 format */ 8969c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors <= 256 && 8970c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image_colors != 0 && image->colormap != NULL && 8971c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_semitransparent == 0 && 8972c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp number_transparent <= 1) 8973c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8974fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8975c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have semitransparent colors so we threshold the 8976130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * opacity to 0 or OpaqueOpacity, and PNG8 can only have one 8977130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * transparent color so if more than one is transparent we merge 8978130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp * them into image->background_color. 8979c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 8980130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp if (number_semitransparent != 0 || number_transparent > 1) 8981c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 8982c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 8983c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Thresholding the alpha channel to binary"); 8984fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8985c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 8986c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 898716ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 8988fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 898916ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 8990c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 8991fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 8992c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 8993c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 899416ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) < OpaqueAlpha/2) 89958ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 899611a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy SetPixelViaPixelInfo(image,&image->background_color,r); 899716ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,TransparentAlpha,r); 89988ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 89998ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 900016ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelAlpha(image,OpaqueAlpha,r); 900116ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 9002c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9003bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9004c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 9005c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 9006fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9007c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image_colors != 0 && image_colors <= 256 && 9008c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp image->colormap != NULL) 9009c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 901016ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].alpha = 901116ea139d53d867211d3bb0fa859a83de653f687ecristy (image->colormap[i].alpha > TransparentAlpha/2 ? 901216ea139d53d867211d3bb0fa859a83de653f687ecristy TransparentAlpha : OpaqueAlpha); 9013c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9014c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 9015c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9016c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 9017c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp /* PNG8 can't have more than 256 colors so we quantize the pixels and 9018e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * background color to the 4-4-4-1, 3-3-3-1 or 3-3-2-1 palette. If the 9019e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * image is mostly gray, the 4-4-4-1 palette is likely to end up with 256 9020e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp * colors or less. 9021c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp */ 9022d337164012450d70d62e71cf4a308a29004f7d57glennrp if (tried_444 == MagickFalse && (image_colors == 0 || image_colors > 256)) 9023d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9024d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9025d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9026d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the background color to 4-4-4"); 9027d337164012450d70d62e71cf4a308a29004f7d57glennrp 9028d337164012450d70d62e71cf4a308a29004f7d57glennrp tried_444 = MagickTrue; 9029d337164012450d70d62e71cf4a308a29004f7d57glennrp 903091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->background_color); 9031d337164012450d70d62e71cf4a308a29004f7d57glennrp 9032d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9033d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9034d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the pixel colors to 4-4-4"); 9035d337164012450d70d62e71cf4a308a29004f7d57glennrp 9036d337164012450d70d62e71cf4a308a29004f7d57glennrp if (image->colormap == NULL) 9037d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9038d337164012450d70d62e71cf4a308a29004f7d57glennrp for (y=0; y < (ssize_t) image->rows; y++) 9039d337164012450d70d62e71cf4a308a29004f7d57glennrp { 904016ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 9041d337164012450d70d62e71cf4a308a29004f7d57glennrp 904216ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 9043d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 9044d337164012450d70d62e71cf4a308a29004f7d57glennrp 9045d337164012450d70d62e71cf4a308a29004f7d57glennrp for (x=0; x < (ssize_t) image->columns; x++) 9046d337164012450d70d62e71cf4a308a29004f7d57glennrp { 904716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 904854cf79782d2eba6612b706093f62474beb855c8dglennrp LBR04PixelRGB(r); 904916ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 9050d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9051bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9052d337164012450d70d62e71cf4a308a29004f7d57glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 9053d337164012450d70d62e71cf4a308a29004f7d57glennrp break; 9054d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9055d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9056d337164012450d70d62e71cf4a308a29004f7d57glennrp 9057d337164012450d70d62e71cf4a308a29004f7d57glennrp else /* Should not reach this; colormap already exists and 9058d337164012450d70d62e71cf4a308a29004f7d57glennrp must be <= 256 */ 9059d337164012450d70d62e71cf4a308a29004f7d57glennrp { 9060d337164012450d70d62e71cf4a308a29004f7d57glennrp if (logging != MagickFalse) 9061d337164012450d70d62e71cf4a308a29004f7d57glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9062d337164012450d70d62e71cf4a308a29004f7d57glennrp " Quantizing the colormap to 4-4-4"); 90638e58efdecda887b08ef730d68290a61081ef2566glennrp 9064d337164012450d70d62e71cf4a308a29004f7d57glennrp for (i=0; i<image_colors; i++) 9065d337164012450d70d62e71cf4a308a29004f7d57glennrp { 906691d99255dd77083750426ba5463e002a586bc9a6glennrp LBR04PacketRGB(image->colormap[i]); 9067d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9068d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9069d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 9070d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9071d337164012450d70d62e71cf4a308a29004f7d57glennrp 907282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (tried_333 == MagickFalse && (image_colors == 0 || image_colors > 256)) 907382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 907482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 907582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 907682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp " Quantizing the background color to 3-3-3"); 907782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 907882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp tried_333 = MagickTrue; 907982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 908091d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->background_color); 908182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 908282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 908382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9084e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-3-1"); 908582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 908682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (image->colormap == NULL) 908782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 908882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (y=0; y < (ssize_t) image->rows; y++) 908982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 909016ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 909182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 909216ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 909382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 909482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 909582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (x=0; x < (ssize_t) image->columns; x++) 909682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 909716ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 909816ea139d53d867211d3bb0fa859a83de653f687ecristy LBR03RGB(r); 909916ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 910082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9101bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 910282b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 910382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp break; 910482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 910582b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 910682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp 910782b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp else /* Should not reach this; colormap already exists and 910882b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp must be <= 256 */ 910982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 911082b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp if (logging != MagickFalse) 911182b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9112e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-3-1"); 911382b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp for (i=0; i<image_colors; i++) 911482b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp { 911591d99255dd77083750426ba5463e002a586bc9a6glennrp LBR03PacketRGB(image->colormap[i]); 911682b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9117d337164012450d70d62e71cf4a308a29004f7d57glennrp } 9118d337164012450d70d62e71cf4a308a29004f7d57glennrp continue; 911982b3c538ac5cfab10ee4ce71e69605dda09195a3glennrp } 9120c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 91218ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (tried_332 == MagickFalse && (image_colors == 0 || image_colors > 256)) 9122c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9123c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9124c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9125c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp " Quantizing the background color to 3-3-2"); 9126c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 91278ca51ad2da164dabc55b192ed7884b745fde0e26glennrp tried_332 = MagickTrue; 91288ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 91293faa9a3fb01696daaf976d595f492cb530bffb21glennrp /* Red and green were already done so we only quantize the blue 91303faa9a3fb01696daaf976d595f492cb530bffb21glennrp * channel 91313faa9a3fb01696daaf976d595f492cb530bffb21glennrp */ 91323faa9a3fb01696daaf976d595f492cb530bffb21glennrp 913391d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->background_color); 9134fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9135c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9136c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9137e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the pixel colors to 3-3-2-1"); 9138fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9139c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (image->colormap == NULL) 9140c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9141c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (y=0; y < (ssize_t) image->rows; y++) 9142c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 914316ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 91448d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp 914516ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 9146c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 9147c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp 9148c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (x=0; x < (ssize_t) image->columns; x++) 9149c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 915016ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,r) == OpaqueAlpha) 915154cf79782d2eba6612b706093f62474beb855c8dglennrp LBR02PixelBlue(r); 915216ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 9153c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9154bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9155c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 9156c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp break; 9157c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9158c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9159c722dd852e8abe407c2846d39662f7ade9c234deglennrp 9160c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp else /* Should not reach this; colormap already exists and 9161c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp must be <= 256 */ 9162c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 9163c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp if (logging != MagickFalse) 9164c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9165e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp " Quantizing the colormap to 3-3-2-1"); 9166c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp for (i=0; i<image_colors; i++) 9167c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp { 916891d99255dd77083750426ba5463e002a586bc9a6glennrp LBR02PacketBlue(image->colormap[i]); 9169c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9170c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 9171c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp continue; 9172c8c2f066877e87b2d3ece7f92a80287177717d9fglennrp } 91738ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 91748ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image_colors == 0 || image_colors > 256) 91758ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 917634ef720923a27004960cbcf4d75a8075445e85d7glennrp /* Take care of special case with 256 opaque colors + 1 transparent 91778ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * color. We don't need to quantize to 2-3-2-1; we only need to 91788ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * eliminate one color, so we'll merge the two darkest red 91798ca51ad2da164dabc55b192ed7884b745fde0e26glennrp * colors (0x49, 0, 0) -> (0x24, 0, 0). 91808ca51ad2da164dabc55b192ed7884b745fde0e26glennrp */ 918134ef720923a27004960cbcf4d75a8075445e85d7glennrp if (logging != MagickFalse) 918234ef720923a27004960cbcf4d75a8075445e85d7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 918334ef720923a27004960cbcf4d75a8075445e85d7glennrp " Merging two dark red background colors to 3-3-2-1"); 918434ef720923a27004960cbcf4d75a8075445e85d7glennrp 91858ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->background_color.red) == 0x49 && 91868ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.green) == 0x00 && 91878ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->background_color.blue) == 0x00) 91888ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 91898ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->background_color.red=ScaleCharToQuantum(0x24); 91908ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9191bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 919234ef720923a27004960cbcf4d75a8075445e85d7glennrp if (logging != MagickFalse) 919334ef720923a27004960cbcf4d75a8075445e85d7glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 919434ef720923a27004960cbcf4d75a8075445e85d7glennrp " Merging two dark red pixel colors to 3-3-2-1"); 919534ef720923a27004960cbcf4d75a8075445e85d7glennrp 91968ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (image->colormap == NULL) 91978ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 91988ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (y=0; y < (ssize_t) image->rows; y++) 91998ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 920016ea139d53d867211d3bb0fa859a83de653f687ecristy r=GetAuthenticPixels(image,0,y,image->columns,1,exception); 9201bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 920216ea139d53d867211d3bb0fa859a83de653f687ecristy if (r == (Quantum *) NULL) 92038ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 9204bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 92058ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (x=0; x < (ssize_t) image->columns; x++) 92068ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 920716ea139d53d867211d3bb0fa859a83de653f687ecristy if (ScaleQuantumToChar(GetPixelRed(image,r)) == 0x49 && 920816ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelGreen(image,r)) == 0x00 && 920916ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(GetPixelBlue(image,r)) == 0x00 && 921016ea139d53d867211d3bb0fa859a83de653f687ecristy GetPixelAlpha(image,r) == OpaqueAlpha) 92118ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 921216ea139d53d867211d3bb0fa859a83de653f687ecristy SetPixelRed(image,ScaleCharToQuantum(0x24),r); 92138ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 921416ea139d53d867211d3bb0fa859a83de653f687ecristy r+=GetPixelChannels(image); 92158ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9216bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 92178ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (SyncAuthenticPixels(image,exception) == MagickFalse) 92188ca51ad2da164dabc55b192ed7884b745fde0e26glennrp break; 9219bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 92208ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92218ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92228ca51ad2da164dabc55b192ed7884b745fde0e26glennrp 92238ca51ad2da164dabc55b192ed7884b745fde0e26glennrp else 92248ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92258ca51ad2da164dabc55b192ed7884b745fde0e26glennrp for (i=0; i<image_colors; i++) 92268ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92278ca51ad2da164dabc55b192ed7884b745fde0e26glennrp if (ScaleQuantumToChar(image->colormap[i].red) == 0x49 && 92288ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].green) == 0x00 && 92298ca51ad2da164dabc55b192ed7884b745fde0e26glennrp ScaleQuantumToChar(image->colormap[i].blue) == 0x00) 92308ca51ad2da164dabc55b192ed7884b745fde0e26glennrp { 92318ca51ad2da164dabc55b192ed7884b745fde0e26glennrp image->colormap[i].red=ScaleCharToQuantum(0x24); 92328ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92338ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92348ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 92358ca51ad2da164dabc55b192ed7884b745fde0e26glennrp } 9236fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9237a8036d6466b63ead629795b60772f160cca77c4cglennrp } 9238fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* END OF BUILD_PALETTE */ 9239fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9240fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* If we are excluding the tRNS chunk and there is transparency, 9241fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * then we must write a Gray-Alpha (color-type 4) or RGBA (color-type 6) 9242fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * PNG. 9243fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 92440e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (mng_info->ping_exclude_tRNS != MagickFalse && 92450e8ea19baa0666ccfe869d19116372f60fe9230fglennrp (number_transparent != 0 || number_semitransparent != 0)) 92460e8ea19baa0666ccfe869d19116372f60fe9230fglennrp { 9247d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp unsigned int colortype=mng_info->write_png_colortype; 92480e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92490e8ea19baa0666ccfe869d19116372f60fe9230fglennrp if (ping_have_color == MagickFalse) 92500e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 5; 92510e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92520e8ea19baa0666ccfe869d19116372f60fe9230fglennrp else 92530e8ea19baa0666ccfe869d19116372f60fe9230fglennrp mng_info->write_png_colortype = 7; 92540e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 92558d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp if (colortype != 0 && 9256d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp mng_info->write_png_colortype != colortype) 92570e8ea19baa0666ccfe869d19116372f60fe9230fglennrp ping_need_colortype_warning=MagickTrue; 92580b206f5daa453dc1035db5890cabc899736dc2d0glennrp 92590e8ea19baa0666ccfe869d19116372f60fe9230fglennrp } 92600e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 9261fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* See if cheap transparency is possible. It is only possible 9262fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * when there is a single transparent color, no semitransparent 9263fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * color, and no opaque color that has the same RGB components 92645a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * as the transparent color. We only need this information if 92655a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * we are writing a PNG with colortype 0 or 2, and we have not 92665a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp * excluded the tRNS chunk. 9267fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 92685a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp if (number_transparent == 1 && 92695a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp mng_info->write_png_colortype < 4) 9270fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9271fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickTrue; 9272fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9273fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (number_semitransparent != 0) 9274fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9275fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9276fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else if (image_colors == 0 || image_colors > 256 || 9277fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp image->colormap == NULL) 9278fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 927916ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 9280fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp *q; 9281fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9282fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (y=0; y < (ssize_t) image->rows; y++) 9283fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9284fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp q=GetVirtualPixels(image,0,y,image->columns,1, exception); 9285fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 928616ea139d53d867211d3bb0fa859a83de653f687ecristy if (q == (Quantum *) NULL) 9287fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9288fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9289fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp for (x=0; x < (ssize_t) image->columns; x++) 9290fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 929116ea139d53d867211d3bb0fa859a83de653f687ecristy if (GetPixelAlpha(image,q) != TransparentAlpha && 929216ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelRed(image,q) == 929316ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.red && 929416ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelGreen(image,q) == 929516ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.green && 929616ea139d53d867211d3bb0fa859a83de653f687ecristy (unsigned short) GetPixelBlue(image,q) == 929716ea139d53d867211d3bb0fa859a83de653f687ecristy ping_trans_color.blue) 9298fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9299fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9300fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9301fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9302fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 930316ea139d53d867211d3bb0fa859a83de653f687ecristy q+=GetPixelChannels(image); 9304fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9305bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9306fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9307fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp break; 9308fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9309fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9310fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9311fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 931267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp /* Assuming that image->colormap[0] is the one transparent color 931367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp * and that all others are opaque. 931467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp */ 9315fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (image_colors > 1) 931667b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp for (i=1; i<image_colors; i++) 931767b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp if (image->colormap[i].red == image->colormap[0].red && 931867b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].green == image->colormap[0].green && 931967b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp image->colormap[i].blue == image->colormap[0].blue) 9320fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 932167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp ping_have_cheap_transparency = MagickFalse; 932267b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp break; 9323fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9324fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9325bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp 9326fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (logging != MagickFalse) 9327fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp { 9328fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9329fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9330fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is not possible."); 9331fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 9332fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9333fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9334fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Cheap transparency is possible."); 9335fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9336fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp } 9337fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp else 9338fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_cheap_transparency = MagickFalse; 9339fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp 93403c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp image_depth=image->depth; 93413c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 93423c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp quantum_info = (QuantumInfo *) NULL; 93433c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp number_colors=0; 9344f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) image->colors; 934517f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy image_matte=image->alpha_trait != UndefinedPixelTrait ? MagickTrue : MagickFalse; 934683c2de583a59e41b57be8036d1cf7392c01d03d7glennrp 934748c20621d4ce02a3833b107f710843d1e524d559glennrp if (mng_info->write_png_colortype < 5) 9348197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp mng_info->IsPalette=image->storage_class == PseudoClass && 9349197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp image_colors <= 256 && image->colormap != NULL; 9350197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp else 9351197c8e6d7a6d3658c44fa95f56c19f88f5d64390glennrp mng_info->IsPalette = MagickFalse; 93523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 935352a479ca718756af72f96e127f8256499ab68f76glennrp if ((mng_info->write_png_colortype == 4 || mng_info->write_png8) && 935452a479ca718756af72f96e127f8256499ab68f76glennrp (image->colors == 0 || image->colormap == NULL)) 935552a479ca718756af72f96e127f8256499ab68f76glennrp { 935616ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 935716ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 935816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(),CoderError, 935915e0155e1d2502703b937a3454bd7907e6fd8dc7glennrp "Cannot write PNG8 or color-type 3; colormap is NULL", 936016ea139d53d867211d3bb0fa859a83de653f687ecristy "`%s'",IMimage->filename); 936152a479ca718756af72f96e127f8256499ab68f76glennrp return(MagickFalse); 936252a479ca718756af72f96e127f8256499ab68f76glennrp } 936352a479ca718756af72f96e127f8256499ab68f76glennrp 93643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate the PNG structures 93663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_USER_MEM_SUPPORTED 936816ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.image=image; 936916ea139d53d867211d3bb0fa859a83de653f687ecristy error_info.exception=exception; 93703e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_write_struct_2(PNG_LIBPNG_VER_STRING,&error_info, 9371cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler,(void *) NULL, 9372cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (png_malloc_ptr) Magick_png_malloc,(png_free_ptr) Magick_png_free); 93730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 93753e0971dc28bdc9227481f5a7f9e1510be662ec4aglennrp ping=png_create_write_struct(PNG_LIBPNG_VER_STRING,&error_info, 9376cf002022280cc4dedb2748ad6f415aac1d44f530glennrp MagickPNGErrorHandler,MagickPNGWarningHandler); 93770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 93793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping == (png_struct *) NULL) 93803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 93810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ping_info=png_create_info_struct(ping); 93830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (ping_info == (png_info *) NULL) 93853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,(png_info **) NULL); 93873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 93883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 93890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 93903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_write_fn(ping,image,png_put_data,png_flush_data); 93910997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=(MemoryInfo *) NULL; 93923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 93935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (setjmp(png_jmpbuf(ping))) 93943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 93953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 93963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG write failed. 93973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 93983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_DEBUG 93993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 94003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) printf("PNG write has failed.\n"); 94013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 94023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 9403868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 9404cf002022280cc4dedb2748ad6f415aac1d44f530glennrp UnlockSemaphoreInfo(ping_semaphore); 94053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9406edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 94070997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info != (MemoryInfo *) NULL) 94080997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 9409edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9410edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp if (quantum_info != (QuantumInfo *) NULL) 9411edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp quantum_info=DestroyQuantumInfo(quantum_info); 9412edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 941316ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 941416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 941516ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 941616ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 94173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 94183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9419edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9420edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* { For navigation to end of SETJMP-protected block. Within this 9421edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * block, use png_error() instead of Throwing an Exception, to ensure 9422edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * that libpng is able to clean up, and that the semaphore is unlocked. 9423edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 9424edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9425868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 9426edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp LockSemaphoreInfo(ping_semaphore); 9427edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 9428edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 9429943b7d3decdd71b57fba7c2fe73fa26f380d692fglennrp#ifdef PNG_BENIGN_ERRORS_SUPPORTED 9430a3a5f956194e91458e2789966ad15308e8f3df47glennrp /* Allow benign errors */ 9431a3a5f956194e91458e2789966ad15308e8f3df47glennrp png_set_benign_errors(ping, 1); 9432a3a5f956194e91458e2789966ad15308e8f3df47glennrp#endif 9433a3a5f956194e91458e2789966ad15308e8f3df47glennrp 9434f9eb20453e3475d44a3833f64c4a662c0106c43edirk#ifdef PNG_SET_USER_LIMITS_SUPPORTED 9435f9eb20453e3475d44a3833f64c4a662c0106c43edirk /* Reject images with too many rows or columns */ 9436f9eb20453e3475d44a3833f64c4a662c0106c43edirk png_set_user_limits(ping, 9437f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 9438f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(WidthResource)), 9439f9eb20453e3475d44a3833f64c4a662c0106c43edirk (png_uint_32) MagickMin(0x7fffffffL, 9440f9eb20453e3475d44a3833f64c4a662c0106c43edirk GetMagickResourceLimit(HeightResource))); 9441f9eb20453e3475d44a3833f64c4a662c0106c43edirk#endif /* PNG_SET_USER_LIMITS_SUPPORTED */ 9442f9eb20453e3475d44a3833f64c4a662c0106c43edirk 94433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 94443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Prepare PNG for writing. 94453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 94469bf97b6c2143eb20c330346b01e82102cc082725glennrp 94473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_MNG_FEATURES_SUPPORTED) 94483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 944925024a6b81adca7509dfd90b03c27dbb42c5889bglennrp { 94503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) png_permit_mng_features(ping,PNG_ALL_MNG_FEATURES); 945125024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# ifdef PNG_WRITE_CHECK_FOR_INVALID_INDEX_SUPPORTED 945225024a6b81adca7509dfd90b03c27dbb42c5889bglennrp /* Disable new libpng-1.5.10 feature when writing a MNG because 945325024a6b81adca7509dfd90b03c27dbb42c5889bglennrp * zero-length PLTE is OK 945425024a6b81adca7509dfd90b03c27dbb42c5889bglennrp */ 945525024a6b81adca7509dfd90b03c27dbb42c5889bglennrp png_set_check_for_invalid_index (ping, 0); 945625024a6b81adca7509dfd90b03c27dbb42c5889bglennrp# endif 945725024a6b81adca7509dfd90b03c27dbb42c5889bglennrp } 94582b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else 94603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 94613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng) 94623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_permit_empty_plte(ping,MagickTrue); 94632b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy# endif 94653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 94662b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy x=0; 94682b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94694e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_width=(png_uint_32) image->columns; 94704e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy ping_height=(png_uint_32) image->rows; 94712b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 94723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8 || mng_info->write_png24 || mng_info->write_png32) 94733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 94740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9475fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png48 || mng_info->write_png64) 9476fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image_depth=16; 9477fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 94783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth != 0) 94793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=mng_info->write_png_depth; 94800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Adjust requested depth to next higher valid depth if necessary */ 94823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 94833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=16; 94840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image_depth > 4) && (image_depth < 8)) 94863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 94870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 3) 94893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=4; 94900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 94913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 94923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 94933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9494e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " width=%.20g",(double) ping_width); 94953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9496e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " height=%.20g",(double) ping_height); 94973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 94988a46d827a124555f0c48fb2368ec1bba8e079ab6cristy " image_matte=%.20g",(double) image->alpha_trait); 94993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95008640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth=%.20g",(double) image->depth); 95013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95028640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Tentative ping_bit_depth=%.20g",(double) image_depth); 95033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 95048640fb5e9b1094f35f8beab436f81661b8a99448glennrp 95053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy save_image_depth=image_depth; 95065af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=(png_byte) save_image_depth; 9507dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 950826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 95093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_pHYs_SUPPORTED) 951026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 951126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 951216ea139d53d867211d3bb0fa859a83de653f687ecristy if ((image->resolution.x != 0) && (image->resolution.y != 0) && 95133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (!mng_info->write_mng || !mng_info->equal_physs)) 95143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 95150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 9516dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9517dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp " Setting up pHYs chunk"); 95183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 95203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9521dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 9522823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_x_resolution= 952316ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.x+0.5)/2.54); 9524823b55c200d7fc1818ab539b036a9c24feaecda8glennrp ping_pHYs_y_resolution= 952516ea139d53d867211d3bb0fa859a83de653f687ecristy (png_uint_32) ((100.0*image->resolution.y+0.5)/2.54); 95263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9527dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 95283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (image->units == PixelsPerCentimeterResolution) 95293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9530dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_METER; 953116ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) (100.0*image->resolution.x+0.5); 953216ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) (100.0*image->resolution.y+0.5); 95333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9534991d11dd9c33e65872778b81aff1347cd2878154glennrp 95353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 95363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9537dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp ping_pHYs_unit_type=PNG_RESOLUTION_UNKNOWN; 953816ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_x_resolution=(png_uint_32) image->resolution.x; 953916ea139d53d867211d3bb0fa859a83de653f687ecristy ping_pHYs_y_resolution=(png_uint_32) image->resolution.y; 95403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 9541991d11dd9c33e65872778b81aff1347cd2878154glennrp 9542823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (logging != MagickFalse) 9543823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9544823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Set up PNG pHYs chunk: xres: %.20g, yres: %.20g, units: %d.", 9545823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (double) ping_pHYs_x_resolution,(double) ping_pHYs_y_resolution, 9546823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (int) ping_pHYs_unit_type); 9547991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_pHYs = MagickTrue; 95483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 954926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 95503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 9551a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 955226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 955326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 9554a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if ((!mng_info->adjoin || !mng_info->equal_backgrounds)) 95553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9556a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp unsigned int 9557a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask; 9558a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 9559a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0xffff; 9560a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 8) 9561a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x00ff; 95620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9563a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 4) 9564a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x000f; 95650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9566a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 2) 9567a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0003; 95680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9569a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (ping_bit_depth == 1) 9570a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mask=0x0001; 95710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9572a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.red=(png_uint_16) 9573a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.red) & mask); 95740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9575a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.green=(png_uint_16) 9576a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.green) & mask); 95770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9578a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp ping_background.blue=(png_uint_16) 9579a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp (ScaleQuantumToShort(image->background_color.blue) & mask); 9580c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9581c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp ping_background.gray=(png_uint_16) ping_background.green; 95820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 95830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 95853b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp { 95863b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95873b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Setting up bKGD chunk (1)"); 9588c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9589c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9590c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 95913b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 95923b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 95933b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " ping_bit_depth=%d",ping_bit_depth); 95943b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp } 95950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 95960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 959726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 95983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 95993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 96003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Select the color type. 96013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 96023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 96033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy old_bit_depth=0; 96040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96051273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && mng_info->write_png8) 96063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 9607fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp /* To do: make this a function cause it's used twice, except 96080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for reducing the sample depth from 8. */ 96090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp number_colors=image_colors; 96118bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 96128bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickFalse; 96130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 96150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Set image palette. 96160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 96170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 96180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 96200fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 96210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up PLTE chunk with %d colors (%d)", 9622f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors, image_colors); 96230fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp for (i=0; i < (ssize_t) number_colors; i++) 96250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 96260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 96270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 96280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 96290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (logging != MagickFalse) 96300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 963167b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#if MAGICKCORE_QUANTUM_DEPTH == 8 96320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " %3ld (%3d,%3d,%3d)", 963367b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#else 963467b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp " %5ld (%5d,%5d,%5d)", 963567b9c1a76a0be5ad88b138c4f46dd860b272e1bcglennrp#endif 96360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (long) i,palette[i].red,palette[i].green,palette[i].blue); 96373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 96392b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 96408bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_PLTE=MagickTrue; 96418bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=ping_bit_depth; 96428bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_num_trans=0; 96435af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 964458e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 96458bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 96460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 96470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp Identify which colormap entry is transparent. 96480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp */ 96490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 96508bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp assert(image->colormap != NULL); 96513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 96528bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (i=0; i < (ssize_t) number_transparent; i++) 96538bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_trans_alpha[i]=0; 96540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96562cc891a179d622dde7bbb8854138851e828bc6eaglennrp ping_num_trans=(unsigned short) (number_transparent + 96578bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp number_semitransparent); 96580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 96600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 96610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96628bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 96638bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp ping_have_tRNS=MagickTrue; 96648bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 96650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96661273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (ping_exclude_bKGD == MagickFalse) 96674f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 96681273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp /* 96691273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp * Identify which colormap entry is the background color. 96701273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp */ 96711273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp 96724f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors-1L,1L); i++) 96734f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (IsPNGColorEqual(ping_background,image->colormap[i])) 96744f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp break; 96750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 96764f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_background.index=(png_byte) i; 9677c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp 9678c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp if (logging != MagickFalse) 9679c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 9680c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9681c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background_color index is %d", 9682c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index); 9683c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 96844f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 96853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } /* end of write_png8 */ 96860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9687fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png_colortype == 1) 9688fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 9689fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image_matte=MagickFalse; 9690fd164d2bf84b111e304959af5698757d60e9b8aeglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 9691fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 9692fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 9693fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png24 || mng_info->write_png48 || 9694fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype == 3) 96953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 96963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 96975af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 96983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 96990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9700fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (mng_info->write_png32 || mng_info->write_png64 || 9701fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype == 7) 97023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 97045af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 97053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* mng_info->write_pngNN not specified */ 97083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 97100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97118bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->write_png_colortype != 0) 97123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97135af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) mng_info->write_png_colortype-1; 97140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97155af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 97165af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 97173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 97182cc891a179d622dde7bbb8854138851e828bc6eaglennrp 97198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 97208bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_matte=MagickFalse; 97217c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 97227c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (logging != MagickFalse) 97237c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97247c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp " PNG colortype %d was specified:",(int) ping_color_type); 97253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97277c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else /* write_png_colortype not specified */ 97283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 97303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97313c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp " Selecting PNG colortype:"); 97320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9733d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_color_type=(png_byte) ((matte != MagickFalse)? 97348bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp PNG_COLOR_TYPE_RGB_ALPHA:PNG_COLOR_TYPE_RGB); 97350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9736d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (image_info->type == TrueColorType) 97373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97385af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 97393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 97403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9742def23e5d7331b1a13ed593b6d6aca516da382328cristy if (image_info->type == TrueColorAlphaType) 97433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97445af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB_ALPHA; 97453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickTrue; 97463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97485aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_info->type == PaletteType || 9749def23e5d7331b1a13ed593b6d6aca516da382328cristy image_info->type == PaletteAlphaType) 97505aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 97515aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 97527c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0 && 9753261f64eea2c3a5a9586da65af2c59d2a39b05de0glennrp image_info->type == UndefinedType) 97543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 97555aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (ping_have_color == MagickFalse) 97568bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 97575aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 97585aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97595aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY; 97605aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 97615aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97630b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 97645aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97655aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_GRAY_ALPHA; 97665aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 97675aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97688bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 97695aa37f69df93407ddf94afdfd2504f708d8b3242glennrp else 97705aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97715aa37f69df93407ddf94afdfd2504f708d8b3242glennrp if (image_matte == MagickFalse) 97725aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97735aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGB; 97745aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickFalse; 97755aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97768bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 97770b206f5daa453dc1035db5890cabc899736dc2d0glennrp else 97785aa37f69df93407ddf94afdfd2504f708d8b3242glennrp { 97795aa37f69df93407ddf94afdfd2504f708d8b3242glennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_RGBA; 97805aa37f69df93407ddf94afdfd2504f708d8b3242glennrp image_matte=MagickTrue; 97815aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97825aa37f69df93407ddf94afdfd2504f708d8b3242glennrp } 97830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 97845aa37f69df93407ddf94afdfd2504f708d8b3242glennrp 97853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 97860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 97873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 978826c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 97898640fb5e9b1094f35f8beab436f81661b8a99448glennrp " Selected PNG colortype=%d",ping_color_type); 979026c990a974947ce90bfb1d08bcd8794bf85f7a65glennrp 97915af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8) 97920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 97930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA || 97940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB || 97950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_color_type == PNG_COLOR_TYPE_RGB_ALPHA) 97960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_bit_depth=8; 97970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 97983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9799d6bf1617e99df0272b231855a933a74e99b6578fglennrp old_bit_depth=ping_bit_depth; 9800d6bf1617e99df0272b231855a933a74e99b6578fglennrp 98015af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 98023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 980317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait == UndefinedPixelTrait && ping_have_non_bw == MagickFalse) 98048d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_bit_depth=1; 98053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 98068640fb5e9b1094f35f8beab436f81661b8a99448glennrp 98075af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_PALETTE) 98083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 980935ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one = 1; 98105af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 98110f111984738842d27d04aed2a3f823d82a943506glennrp 98120f111984738842d27d04aed2a3f823d82a943506glennrp if (image->colors == 0) 98130f111984738842d27d04aed2a3f823d82a943506glennrp { 98140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* DO SOMETHING */ 9815edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"image has 0 colors"); 98160f111984738842d27d04aed2a3f823d82a943506glennrp } 98170f111984738842d27d04aed2a3f823d82a943506glennrp 981835ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) < (ssize_t) image_colors) 98195af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 9820d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 98213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 9822d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (logging != MagickFalse) 9823d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 9824d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9825d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Number of colors: %.20g",(double) image_colors); 98260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9827d6bf1617e99df0272b231855a933a74e99b6578fglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9828d6bf1617e99df0272b231855a933a74e99b6578fglennrp " Tentative PNG bit depth: %d",ping_bit_depth); 9829d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 98300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9831d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (ping_bit_depth < (int) mng_info->write_png_depth) 9832d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_bit_depth = mng_info->write_png_depth; 98333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 98342cc891a179d622dde7bbb8854138851e828bc6eaglennrp 98355af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 98362b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 98383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 98393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98401a56e9c9268976936eeab9fe97eb664b847e444cglennrp " Tentative PNG color type: %s (%.20g)", 98411a56e9c9268976936eeab9fe97eb664b847e444cglennrp PngColorTypeToString(ping_color_type), 98421a56e9c9268976936eeab9fe97eb664b847e444cglennrp (double) ping_color_type); 98430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9845e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_info->type: %.20g",(double) image_info->type); 98460fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9848e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " image_depth: %.20g",(double) image_depth); 98490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 98513c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp 98528640fb5e9b1094f35f8beab436f81661b8a99448glennrp " image->depth: %.20g",(double) image->depth); 98538640fb5e9b1094f35f8beab436f81661b8a99448glennrp 98548640fb5e9b1094f35f8beab436f81661b8a99448glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 9855e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " ping_bit_depth: %.20g",(double) ping_bit_depth); 98563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 98573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 985858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 98593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 98604f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (mng_info->IsPalette) 98614f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98627c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 98637c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp { 98647c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 98652b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98667c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (ping_have_color != MagickFalse) 98677c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type=PNG_COLOR_TYPE_RGBA; 98687c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp } 98692b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 98703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 98714f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp * Determine if there is any transparent color. 98723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 98734f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (number_transparent + number_semitransparent == 0) 98744f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98754f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 98764f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp No transparent pixels are present. Change 4 or 6 to 0 or 2. 98774f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp */ 9878a6a0663bea94c73cf424f0b49076e7c037d084d4glennrp 98794f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image_matte=MagickFalse; 98807c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp 98817c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 98827c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type&=0x03; 98834f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 98840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98854f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 98864f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 98874f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp unsigned int 9888bb4f99d3d6ed6a8eee38324baf473c45e4f644e4glennrp mask; 98893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 98904f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0xffff; 98910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98924f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 8) 98934f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x00ff; 98940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98954f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 4) 98964f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x000f; 98970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 98984f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 2) 98994f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0003; 99000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99014f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_bit_depth == 1) 99024f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp mask=0x0001; 99030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99044f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red=(png_uint_16) 99054f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].red) & mask); 99060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99074f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green=(png_uint_16) 99084f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].green) & mask); 99090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99104f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue=(png_uint_16) 99114f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (ScaleQuantumToShort(image->colormap[0].blue) & mask); 99120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99134f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray=(png_uint_16) 991411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy (ScaleQuantumToShort(GetPixelInfoIntensity(image, 99154f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp image->colormap)) & mask); 99160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99174f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.index=(png_byte) 0; 99180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99194f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_have_tRNS=MagickTrue; 99204f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99224f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 99234f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99244f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp /* 9925fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * Determine if there is one and only one transparent color 9926fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp * and if so if it is fully transparent. 9927fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp */ 9928fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp if (ping_have_cheap_transparency == MagickFalse) 9929fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp ping_have_tRNS=MagickFalse; 99304f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99312b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 99324f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_have_tRNS != MagickFalse) 99334f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99347c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp if (mng_info->write_png_colortype == 0) 99357c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp ping_color_type &= 0x03; /* changes 4 or 6 to 0 or 2 */ 99360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99374f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (image_depth == 8) 99384f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99394f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.red&=0xff; 99404f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.green&=0xff; 99414f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.blue&=0xff; 99424f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray&=0xff; 99434f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99444f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99454f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99464f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp else 99474f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth == 8) 99493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red&=0xff; 99515af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green&=0xff; 99525af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue&=0xff; 99535af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray&=0xff; 99543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99578640fb5e9b1094f35f8beab436f81661b8a99448glennrp 99583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy matte=image_matte; 99590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99602e09f55407bbe197cbaf4f88b1d7265f62d7f6c7glennrp if (ping_have_tRNS != MagickFalse) 99613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_matte=MagickFalse; 99620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 996339992b4dd9b12ef752d55b8e402c069698851f72glennrp if ((mng_info->IsPalette) && 99643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE && 99658d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_color == MagickFalse && 99668d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp (image_matte == MagickFalse || image_depth >= 8)) 99673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 996835ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t one=1; 99690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_matte != MagickFalse) 99719c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_color_type=PNG_COLOR_TYPE_GRAY_ALPHA; 99720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99737c4c9e67499f5a8e5cfd4148a3424bacd8fc635bglennrp else if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_GRAY_ALPHA) 99743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 99755af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=PNG_COLOR_TYPE_GRAY; 99764f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 99773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (save_image_depth == 16 && image_depth == 8) 99784f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99794f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 99804f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 99814f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 99824f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color (0)"); 99834f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99844f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp ping_trans_color.gray*=0x0101; 99854f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 99863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 99870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > MAGICKCORE_QUANTUM_DEPTH) 99893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=MAGICKCORE_QUANTUM_DEPTH; 99900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 9991136ee3aa5987c7418c835f7ee741e1af1dadb113glennrp if ((image_colors == 0) || 9992d17915c2c5a29b7f778217765f0f2d354c829e9eglennrp ((ssize_t) (image_colors-1) > (ssize_t) MaxColormapSize)) 9993f09bdedccf9ca10bc002a946227df3367cb58d14glennrp image_colors=(int) (one << image_depth); 99940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth > 8) 99965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=16; 99970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 99983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 99993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100005af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=8; 100015af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 100023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if(!mng_info->write_png_depth) 100043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100055af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 100060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1000735ef824baa82511126ff0072ae30eee0da9c05a3cristy while ((int) (one << ping_bit_depth) 10008bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy < (ssize_t) image_colors) 100095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 100103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100122b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else if (ping_color_type == 100140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp PNG_COLOR_TYPE_GRAY && image_colors < 17 && 100153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->IsPalette) 100163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if grayscale is reducible */ 100181a0aaa639fb2360f2db93f9b0ed2b42ef6d2106dglennrp 100193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 100203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=MagickTrue, 100213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=MagickTrue, 100223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickTrue; 100233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10024bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image_colors; i++) 100253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 100273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity; 100283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy intensity=ScaleQuantumToChar(image->colormap[i].red); 100303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 100313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((intensity & 0x0f) != ((intensity & 0xf0) >> 4)) 100323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_4_ok=depth_2_ok=depth_1_ok=MagickFalse; 100333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if ((intensity & 0x03) != ((intensity & 0x0c) >> 2)) 100343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_2_ok=depth_1_ok=MagickFalse; 100354bf89731a90c6e03598950223e19e7be7b95d630glennrp else if ((intensity & 0x01) != ((intensity & 0x02) >> 1)) 100363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy depth_1_ok=MagickFalse; 100373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100382b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (depth_1_ok && mng_info->write_png_depth <= 1) 100409c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=1; 100410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_2_ok && mng_info->write_png_depth <= 2) 100439c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=2; 100440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (depth_4_ok && mng_info->write_png_depth <= 4) 100469c1eb0729653219b9da9037e044501a6dce79d10glennrp ping_bit_depth=4; 100473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100492b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 100505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp image_depth=ping_bit_depth; 100513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 100540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 100563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1005717a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 1005817a1485544c62993fc7a94e343c87fed5f3e6407glennrp 100593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth <= 8) 100603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 100623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Set image palette. 100633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 100645af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_color_type=(png_byte) PNG_COLOR_TYPE_PALETTE; 100650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100663d627862fb79aad8a20be4f1587f0b8761db441aglennrp if (!(mng_info->have_write_global_plte && matte == MagickFalse)) 100673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10068bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) number_colors; i++) 100693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 100703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].red=ScaleQuantumToChar(image->colormap[i].red); 100713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].green=ScaleQuantumToChar(image->colormap[i].green); 100723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palette[i].blue=ScaleQuantumToChar(image->colormap[i].blue); 100733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100753b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 100763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1007798156a3a465a004545e39434c63052b955a74d1cglennrp " Setting up PLTE chunk with %d colors", 10078f09bdedccf9ca10bc002a946227df3367cb58d14glennrp number_colors); 100790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1008039992b4dd9b12ef752d55b8e402c069698851f72glennrp ping_have_PLTE=MagickTrue; 100813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100820fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* color_type is PNG_COLOR_TYPE_PALETTE */ 10084d6bf1617e99df0272b231855a933a74e99b6578fglennrp if (mng_info->write_png_depth == 0) 100853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10086befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy size_t 10087befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one; 10088befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy 100895af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth=1; 10090befe4d21bf21c8f8fb5c8cc01fe60fe4accac47fcristy one=1; 100910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1009216ea139d53d867211d3bb0fa859a83de653f687ecristy while ((one << ping_bit_depth) < (size_t) number_colors) 100935af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_bit_depth <<= 1; 100943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 100950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 100965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_num_trans=0; 100970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1009858e017631f66141a6e36ddbe03a54f6e3ee3a253glennrp if (matte != MagickFalse) 100990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 101000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* 10101d6bf1617e99df0272b231855a933a74e99b6578fglennrp * Set up trans_colors array. 10102d6bf1617e99df0272b231855a933a74e99b6578fglennrp */ 101030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp assert(number_colors <= 256); 101043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10105d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_num_trans=(unsigned short) (number_transparent + 10106d6bf1617e99df0272b231855a933a74e99b6578fglennrp number_semitransparent); 101073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101080fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_num_trans == 0) 101090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_tRNS=MagickFalse; 101100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10111d6bf1617e99df0272b231855a933a74e99b6578fglennrp else 101120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 10113c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10114c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10115c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10116c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Scaling ping_trans_color (1)"); 10117c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10118d6bf1617e99df0272b231855a933a74e99b6578fglennrp ping_have_tRNS=MagickTrue; 10119d6bf1617e99df0272b231855a933a74e99b6578fglennrp 10120d6bf1617e99df0272b231855a933a74e99b6578fglennrp for (i=0; i < ping_num_trans; i++) 10121d6bf1617e99df0272b231855a933a74e99b6578fglennrp { 10122750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp ping_trans_alpha[i]= (png_byte) 1012316ea139d53d867211d3bb0fa859a83de653f687ecristy ScaleQuantumToChar(image->colormap[i].alpha); 10124d6bf1617e99df0272b231855a933a74e99b6578fglennrp } 101250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 101260fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 101273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 101313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10132c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 101333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_depth < 8) 101343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_depth=8; 101350fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 101363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((save_image_depth == 16) && (image_depth == 8)) 101373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101384f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 101394f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 101404f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101414f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " Scaling ping_trans_color from (%d,%d,%d)", 101424f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 101434f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 101444f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 101454f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 101464f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 101475af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.red*=0x0101; 101485af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.green*=0x0101; 101495af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.blue*=0x0101; 101505af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp ping_trans_color.gray*=0x0101; 101514f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp 101524f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (logging != MagickFalse) 101534f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp { 101544f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101554f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp " to (%d,%d,%d)", 101564f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.red, 101574f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.green, 101584f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (int) ping_trans_color.blue); 101594f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp } 101603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 101623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101634383ec8c3c8811128f5a8a034d67c47db5e7e75acristy if (ping_bit_depth < (ssize_t) mng_info->write_png_depth) 101644383ec8c3c8811128f5a8a034d67c47db5e7e75acristy ping_bit_depth = (ssize_t) mng_info->write_png_depth; 101652cc891a179d622dde7bbb8854138851e828bc6eaglennrp 101663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 101673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Adjust background and transparency samples in sub-8-bit grayscale files. 101683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 101695af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_bit_depth < 8 && ping_color_type == 101703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_COLOR_TYPE_GRAY) 101713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 101723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_uint_16 101733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy maxval; 101743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1017535ef824baa82511126ff0072ae30eee0da9c05a3cristy size_t 1017635ef824baa82511126ff0072ae30eee0da9c05a3cristy one=1; 1017735ef824baa82511126ff0072ae30eee0da9c05a3cristy 1017822ffd97a7a54140ebcfe886af90cbdb7bfe41e89cristy maxval=(png_uint_16) ((one << ping_bit_depth)-1); 101793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101804f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_bKGD == MagickFalse) 1018126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 101823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1018316ea139d53d867211d3bb0fa859a83de653f687ecristy ping_background.gray=(png_uint_16) ((maxval/65535.)* 1018411a06d3f2cac0f17af7963e83bc6e9ebd2a377c0cristy (ScaleQuantumToShort(((GetPixelInfoIntensity(image, 1018516ea139d53d867211d3bb0fa859a83de653f687ecristy &image->background_color))) +.5))); 1018616ea139d53d867211d3bb0fa859a83de653f687ecristy 101873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 101888f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1018916ea139d53d867211d3bb0fa859a83de653f687ecristy " Setting up bKGD chunk (2)"); 1019016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1019116ea139d53d867211d3bb0fa859a83de653f687ecristy " background_color index is %d", 1019216ea139d53d867211d3bb0fa859a83de653f687ecristy (int) ping_background.index); 101933b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 10194991d11dd9c33e65872778b81aff1347cd2878154glennrp ping_have_bKGD = MagickTrue; 1019526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 101963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 101973e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 101983e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 101993e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " Scaling ping_trans_color.gray from %d", 102003e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (int)ping_trans_color.gray); 102013e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 102029be9b1cfe4c5ead507b2ad633cced4321db3c806glennrp ping_trans_color.gray=(png_uint_16) ((maxval/255.)*( 102033e3e20f27f74686a93873f25b015e0e8e40f451dglennrp ping_trans_color.gray)+.5); 102043e3e20f27f74686a93873f25b015e0e8e40f451dglennrp 102053e3e20f27f74686a93873f25b015e0e8e40f451dglennrp if (logging != MagickFalse) 102063e3e20f27f74686a93873f25b015e0e8e40f451dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102073e3e20f27f74686a93873f25b015e0e8e40f451dglennrp " to %d", (int)ping_trans_color.gray); 102083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1020917a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1021026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 1021126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 102121273f7b031edcb07e2ee4835455712ebdd0b2f60glennrp if (mng_info->IsPalette && (int) ping_color_type == PNG_COLOR_TYPE_PALETTE) 1021317a1485544c62993fc7a94e343c87fed5f3e6407glennrp { 1021417a1485544c62993fc7a94e343c87fed5f3e6407glennrp /* 1021517a1485544c62993fc7a94e343c87fed5f3e6407glennrp Identify which colormap entry is the background color. 1021617a1485544c62993fc7a94e343c87fed5f3e6407glennrp */ 1021717a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1021817a1485544c62993fc7a94e343c87fed5f3e6407glennrp number_colors=image_colors; 1021917a1485544c62993fc7a94e343c87fed5f3e6407glennrp 10220a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp for (i=0; i < (ssize_t) MagickMax(1L*number_colors,1L); i++) 10221a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp if (IsPNGColorEqual(image->background_color,image->colormap[i])) 1022217a1485544c62993fc7a94e343c87fed5f3e6407glennrp break; 1022317a1485544c62993fc7a94e343c87fed5f3e6407glennrp 1022417a1485544c62993fc7a94e343c87fed5f3e6407glennrp ping_background.index=(png_byte) i; 1022517a1485544c62993fc7a94e343c87fed5f3e6407glennrp 102263b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102290fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up bKGD chunk with index=%d",(int) i); 102300fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10231a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 1023213d07043243e0c8c151aad7db5240b75e76ca281cristy if (i < (ssize_t) number_colors) 10233a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp { 102340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_have_bKGD = MagickTrue; 102353b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 102363b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " background =(%d,%d,%d)", 102400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.red, 102410fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.green, 102420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_background.blue); 102430fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10244a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp } 1024517a1485544c62993fc7a94e343c87fed5f3e6407glennrp 10246d6bf1617e99df0272b231855a933a74e99b6578fglennrp else /* Can't happen */ 102473c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp { 102483b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 102493b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102503b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " No room in PLTE to add bKGD color"); 102513c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp ping_have_bKGD = MagickFalse; 102523c21811cab8a3b168295e3f0da1909c4e2a7da15glennrp } 1025317a1485544c62993fc7a94e343c87fed5f3e6407glennrp } 1025426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1025517a1485544c62993fc7a94e343c87fed5f3e6407glennrp 102563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102581a56e9c9268976936eeab9fe97eb664b847e444cglennrp " PNG color type: %s (%d)", PngColorTypeToString(ping_color_type), 102591a56e9c9268976936eeab9fe97eb664b847e444cglennrp ping_color_type); 102603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 102613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize compression level and filtering. 102623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 102633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102640fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 102650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102660fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Setting up deflate compression"); 102670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102690fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Compression buffer size: 32768"); 102700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 102710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_compression_buffer_size(ping,32768L); 102730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 102753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 102763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Compression mem level: 9"); 102770fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 102784054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_compression_mem_level(ping, 9); 102794054bfbdca478fe065f01d7f8285f7c173ccfcfccristy 1028010d739ef54404090a55cb8977fc51f85cafa81a5glennrp /* Untangle the "-quality" setting: 1028110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1028210d739ef54404090a55cb8977fc51f85cafa81a5glennrp Undefined is 0; the default is used. 1028310d739ef54404090a55cb8977fc51f85cafa81a5glennrp Default is 75 1028410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1028510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10's digit: 1028610d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10287ef804f5802b3d6517d516556b64fccc5843710b6glennrp 0 or omitted: Use Z_HUFFMAN_ONLY strategy with the 1028810d739ef54404090a55cb8977fc51f85cafa81a5glennrp zlib default compression level 1028910d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1-9: the zlib compression level 1029110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1's digit: 1029310d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 0-4: the PNG filter method 1029510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1029610d739ef54404090a55cb8977fc51f85cafa81a5glennrp 5: libpng adaptive filtering if compression level > 5 1029710d739ef54404090a55cb8977fc51f85cafa81a5glennrp libpng filter type "none" if compression level <= 5 1029810d739ef54404090a55cb8977fc51f85cafa81a5glennrp or if image is grayscale or palette 10299750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 1030010d739ef54404090a55cb8977fc51f85cafa81a5glennrp 6: libpng adaptive filtering 1030110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1030210d739ef54404090a55cb8977fc51f85cafa81a5glennrp 7: "LOCO" filtering (intrapixel differing) if writing 1030385dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp a MNG, otherwise "none". Did not work in IM-6.7.0-9 1030410d739ef54404090a55cb8977fc51f85cafa81a5glennrp and earlier because of a missing "else". 1030510d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1030685dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp 8: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), adaptive 1030785dfe1a0f14d543ecebd2cc0741ba9dcb2fe67bbglennrp filtering. Unused prior to IM-6.7.0-10, was same as 6 1030810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 10309ef804f5802b3d6517d516556b64fccc5843710b6glennrp 9: Z_RLE strategy (or Z_HUFFMAN_ONLY if quality < 10), no PNG filters 103101868258559ddf946fa73ef72dd43507b32623705glennrp Unused prior to IM-6.7.0-10, was same as 6 1031110d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1031210d739ef54404090a55cb8977fc51f85cafa81a5glennrp Note that using the -quality option, not all combinations of 1031310d739ef54404090a55cb8977fc51f85cafa81a5glennrp PNG filter type, zlib compression level, and zlib compression 1031416ea139d53d867211d3bb0fa859a83de653f687ecristy strategy are possible. This will be addressed soon in a 1031516ea139d53d867211d3bb0fa859a83de653f687ecristy release that accomodates "-define png:compression-strategy", etc. 1031610d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1031710d739ef54404090a55cb8977fc51f85cafa81a5glennrp */ 1031810d739ef54404090a55cb8977fc51f85cafa81a5glennrp 1031929dd80efe8d7489d5f689a8a723454e684f92a8fdirk quality=image_info->quality == UndefinedCompressionQuality ? 75UL : 1032029dd80efe8d7489d5f689a8a723454e684f92a8fdirk image_info->quality; 103210fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103221868258559ddf946fa73ef72dd43507b32623705glennrp if (quality <= 9) 103231868258559ddf946fa73ef72dd43507b32623705glennrp { 103241868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 103251868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 103261868258559ddf946fa73ef72dd43507b32623705glennrp } 10327750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp 103281868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_level == 0) 103293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 103303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 103313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy level; 103323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 10333bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy level=(int) MagickMin((ssize_t) quality/10,9); 103340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103351868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = level+1; 103361868258559ddf946fa73ef72dd43507b32623705glennrp } 103370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103381868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy == 0) 103391868258559ddf946fa73ef72dd43507b32623705glennrp { 103401868258559ddf946fa73ef72dd43507b32623705glennrp if ((quality %10) == 8 || (quality %10) == 9) 10341a24b245fac14ef0617d691de0942697f2eb31b05glennrp#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ 10342a24b245fac14ef0617d691de0942697f2eb31b05glennrp mng_info->write_png_compression_strategy=Z_RLE+1; 10343a24b245fac14ef0617d691de0942697f2eb31b05glennrp#else 10344a24b245fac14ef0617d691de0942697f2eb31b05glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 10345a24b245fac14ef0617d691de0942697f2eb31b05glennrp#endif 103463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103481868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 0) 103491868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter=((int) quality % 10) + 1; 103501868258559ddf946fa73ef72dd43507b32623705glennrp 103511868258559ddf946fa73ef72dd43507b32623705glennrp if (logging != MagickFalse) 103523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 103531868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level) 103543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103551868258559ddf946fa73ef72dd43507b32623705glennrp " Compression level: %d", 103561868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_level-1); 103570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103581868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy) 103591868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103601868258559ddf946fa73ef72dd43507b32623705glennrp " Compression strategy: %d", 103611868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_strategy-1); 103620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103631868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103641868258559ddf946fa73ef72dd43507b32623705glennrp " Setting up filtering"); 103653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 103664054bfbdca478fe065f01d7f8285f7c173ccfcfccristy if (mng_info->write_png_compression_filter == 6) 1036710d739ef54404090a55cb8977fc51f85cafa81a5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103681868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: ADAPTIVE"); 103694054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 0 || 103704054bfbdca478fe065f01d7f8285f7c173ccfcfccristy mng_info->write_png_compression_filter == 1) 103711868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103721868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: NONE"); 103731868258559ddf946fa73ef72dd43507b32623705glennrp else 103741868258559ddf946fa73ef72dd43507b32623705glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 103751868258559ddf946fa73ef72dd43507b32623705glennrp " Base filter method: %d", 103761868258559ddf946fa73ef72dd43507b32623705glennrp (int) mng_info->write_png_compression_filter-1); 103773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 103780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103791868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_level != 0) 103801868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_level(ping,mng_info->write_png_compression_level-1); 103810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 103821868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_filter == 6) 103831868258559ddf946fa73ef72dd43507b32623705glennrp { 103841868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_GRAY) || 103851868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_PALETTE) || 103861868258559ddf946fa73ef72dd43507b32623705glennrp (quality < 50)) 103871868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 103881868258559ddf946fa73ef72dd43507b32623705glennrp else 103891868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 103901868258559ddf946fa73ef72dd43507b32623705glennrp } 103914054bfbdca478fe065f01d7f8285f7c173ccfcfccristy else if (mng_info->write_png_compression_filter == 7 || 103921868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter == 10) 103931868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_ALL_FILTERS); 1039410d739ef54404090a55cb8977fc51f85cafa81a5glennrp 103951868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 8) 103961868258559ddf946fa73ef72dd43507b32623705glennrp { 103971868258559ddf946fa73ef72dd43507b32623705glennrp#if defined(PNG_MNG_FEATURES_SUPPORTED) && defined(PNG_INTRAPIXEL_DIFFERENCING) 103981868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_mng) 103991868258559ddf946fa73ef72dd43507b32623705glennrp { 104001868258559ddf946fa73ef72dd43507b32623705glennrp if (((int) ping_color_type == PNG_COLOR_TYPE_RGB) || 104011868258559ddf946fa73ef72dd43507b32623705glennrp ((int) ping_color_type == PNG_COLOR_TYPE_RGBA)) 104021868258559ddf946fa73ef72dd43507b32623705glennrp ping_filter_method=PNG_INTRAPIXEL_DIFFERENCING; 104031868258559ddf946fa73ef72dd43507b32623705glennrp } 104041868258559ddf946fa73ef72dd43507b32623705glennrp#endif 104054054bfbdca478fe065f01d7f8285f7c173ccfcfccristy png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 104061868258559ddf946fa73ef72dd43507b32623705glennrp } 104070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104081868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter == 9) 104091868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE,PNG_NO_FILTERS); 104100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104111868258559ddf946fa73ef72dd43507b32623705glennrp else if (mng_info->write_png_compression_filter != 0) 104121868258559ddf946fa73ef72dd43507b32623705glennrp png_set_filter(ping,PNG_FILTER_TYPE_BASE, 104131868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter-1); 104140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 104151868258559ddf946fa73ef72dd43507b32623705glennrp if (mng_info->write_png_compression_strategy != 0) 104161868258559ddf946fa73ef72dd43507b32623705glennrp png_set_compression_strategy(ping, 104171868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy-1); 104182b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 10419dec72c9b492c176af9813be3105518e91835ed37glennrp ping_interlace_method=image_info->interlace != NoInterlace; 10420dec72c9b492c176af9813be3105518e91835ed37glennrp 10421dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_mng) 10422dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_sig_bytes(ping,8); 10423dec72c9b492c176af9813be3105518e91835ed37glennrp 10424dec72c9b492c176af9813be3105518e91835ed37glennrp /* Bail out if cannot meet defined png:bit-depth or png:color-type */ 10425dec72c9b492c176af9813be3105518e91835ed37glennrp 10426dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype != 0) 10427dec72c9b492c176af9813be3105518e91835ed37glennrp { 10428dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY) 10429dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_have_color != MagickFalse) 10430dec72c9b492c176af9813be3105518e91835ed37glennrp { 10431dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type = PNG_COLOR_TYPE_RGB; 10432dec72c9b492c176af9813be3105518e91835ed37glennrp 10433dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_bit_depth < 8) 10434dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth=8; 10435dec72c9b492c176af9813be3105518e91835ed37glennrp } 10436dec72c9b492c176af9813be3105518e91835ed37glennrp 10437dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_GRAY_ALPHA) 10438dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_have_color != MagickFalse) 10439dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type = PNG_COLOR_TYPE_RGB_ALPHA; 10440dec72c9b492c176af9813be3105518e91835ed37glennrp } 10441dec72c9b492c176af9813be3105518e91835ed37glennrp 10442dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_need_colortype_warning != MagickFalse || 10443dec72c9b492c176af9813be3105518e91835ed37glennrp ((mng_info->write_png_depth && 10444dec72c9b492c176af9813be3105518e91835ed37glennrp (int) mng_info->write_png_depth != ping_bit_depth) || 10445dec72c9b492c176af9813be3105518e91835ed37glennrp (mng_info->write_png_colortype && 10446dec72c9b492c176af9813be3105518e91835ed37glennrp ((int) mng_info->write_png_colortype-1 != ping_color_type && 10447dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_colortype != 7 && 10448dec72c9b492c176af9813be3105518e91835ed37glennrp !(mng_info->write_png_colortype == 5 && ping_color_type == 0))))) 10449dec72c9b492c176af9813be3105518e91835ed37glennrp { 10450dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10451dec72c9b492c176af9813be3105518e91835ed37glennrp { 10452dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_need_colortype_warning != MagickFalse) 10453dec72c9b492c176af9813be3105518e91835ed37glennrp { 10454dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10455dec72c9b492c176af9813be3105518e91835ed37glennrp " Image has transparency but tRNS chunk was excluded"); 10456dec72c9b492c176af9813be3105518e91835ed37glennrp } 10457dec72c9b492c176af9813be3105518e91835ed37glennrp 10458dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_depth) 10459dec72c9b492c176af9813be3105518e91835ed37glennrp { 10460dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10461dec72c9b492c176af9813be3105518e91835ed37glennrp " Defined png:bit-depth=%u, Computed depth=%u", 10462dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_depth, 10463dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth); 10464dec72c9b492c176af9813be3105518e91835ed37glennrp } 10465dec72c9b492c176af9813be3105518e91835ed37glennrp 10466dec72c9b492c176af9813be3105518e91835ed37glennrp if (mng_info->write_png_colortype) 10467dec72c9b492c176af9813be3105518e91835ed37glennrp { 10468dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10469dec72c9b492c176af9813be3105518e91835ed37glennrp " Defined png:color-type=%u, Computed color type=%u", 10470dec72c9b492c176af9813be3105518e91835ed37glennrp mng_info->write_png_colortype-1, 10471dec72c9b492c176af9813be3105518e91835ed37glennrp ping_color_type); 10472dec72c9b492c176af9813be3105518e91835ed37glennrp } 10473dec72c9b492c176af9813be3105518e91835ed37glennrp } 10474dec72c9b492c176af9813be3105518e91835ed37glennrp 10475dec72c9b492c176af9813be3105518e91835ed37glennrp png_warning(ping, 10476dec72c9b492c176af9813be3105518e91835ed37glennrp "Cannot write image with defined png:bit-depth or png:color-type."); 10477dec72c9b492c176af9813be3105518e91835ed37glennrp } 10478dec72c9b492c176af9813be3105518e91835ed37glennrp 1047917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image_matte != MagickFalse && image->alpha_trait == UndefinedPixelTrait) 10480dec72c9b492c176af9813be3105518e91835ed37glennrp { 10481dec72c9b492c176af9813be3105518e91835ed37glennrp /* Add an opaque matte channel */ 10482dec72c9b492c176af9813be3105518e91835ed37glennrp image->alpha_trait = BlendPixelTrait; 10483dec72c9b492c176af9813be3105518e91835ed37glennrp (void) SetImageAlpha(image,OpaqueAlpha,exception); 10484dec72c9b492c176af9813be3105518e91835ed37glennrp 10485dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10486dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10487dec72c9b492c176af9813be3105518e91835ed37glennrp " Added an opaque matte channel"); 10488dec72c9b492c176af9813be3105518e91835ed37glennrp } 10489dec72c9b492c176af9813be3105518e91835ed37glennrp 10490dec72c9b492c176af9813be3105518e91835ed37glennrp if (number_transparent != 0 || number_semitransparent != 0) 10491dec72c9b492c176af9813be3105518e91835ed37glennrp { 10492dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_color_type < 4) 10493dec72c9b492c176af9813be3105518e91835ed37glennrp { 10494dec72c9b492c176af9813be3105518e91835ed37glennrp ping_have_tRNS=MagickTrue; 10495dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10496dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10497dec72c9b492c176af9813be3105518e91835ed37glennrp " Setting ping_have_tRNS=MagickTrue."); 10498dec72c9b492c176af9813be3105518e91835ed37glennrp } 10499dec72c9b492c176af9813be3105518e91835ed37glennrp } 10500dec72c9b492c176af9813be3105518e91835ed37glennrp 10501dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10502dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10503dec72c9b492c176af9813be3105518e91835ed37glennrp " Writing PNG header chunks"); 10504dec72c9b492c176af9813be3105518e91835ed37glennrp 10505dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_IHDR(ping,ping_info,ping_width,ping_height, 10506dec72c9b492c176af9813be3105518e91835ed37glennrp ping_bit_depth,ping_color_type, 10507dec72c9b492c176af9813be3105518e91835ed37glennrp ping_interlace_method,ping_compression_method, 10508dec72c9b492c176af9813be3105518e91835ed37glennrp ping_filter_method); 10509dec72c9b492c176af9813be3105518e91835ed37glennrp 10510dec72c9b492c176af9813be3105518e91835ed37glennrp if (ping_color_type == 3 && ping_have_PLTE != MagickFalse) 10511dec72c9b492c176af9813be3105518e91835ed37glennrp { 10512dec72c9b492c176af9813be3105518e91835ed37glennrp png_set_PLTE(ping,ping_info,palette,number_colors); 10513dec72c9b492c176af9813be3105518e91835ed37glennrp 10514dec72c9b492c176af9813be3105518e91835ed37glennrp if (logging != MagickFalse) 10515dec72c9b492c176af9813be3105518e91835ed37glennrp { 10516dec72c9b492c176af9813be3105518e91835ed37glennrp for (i=0; i< (ssize_t) number_colors; i++) 10517dec72c9b492c176af9813be3105518e91835ed37glennrp { 10518dec72c9b492c176af9813be3105518e91835ed37glennrp if (i < ping_num_trans) 10519dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10520dec72c9b492c176af9813be3105518e91835ed37glennrp " PLTE[%d] = (%d,%d,%d), tRNS[%d] = (%d)", 10521dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10522dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].red, 10523dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].green, 10524dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].blue, 10525dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10526dec72c9b492c176af9813be3105518e91835ed37glennrp (int) ping_trans_alpha[i]); 10527dec72c9b492c176af9813be3105518e91835ed37glennrp else 10528dec72c9b492c176af9813be3105518e91835ed37glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10529dec72c9b492c176af9813be3105518e91835ed37glennrp " PLTE[%d] = (%d,%d,%d)", 10530dec72c9b492c176af9813be3105518e91835ed37glennrp (int) i, 10531dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].red, 10532dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].green, 10533dec72c9b492c176af9813be3105518e91835ed37glennrp (int) palette[i].blue); 10534dec72c9b492c176af9813be3105518e91835ed37glennrp } 10535dec72c9b492c176af9813be3105518e91835ed37glennrp } 10536dec72c9b492c176af9813be3105518e91835ed37glennrp } 10537dec72c9b492c176af9813be3105518e91835ed37glennrp 105380d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy /* Only write the iCCP chunk if we are not writing the sRGB chunk. */ 105390d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if (ping_exclude_sRGB != MagickFalse || 105403d627862fb79aad8a20be4f1587f0b8761db441aglennrp (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 105410d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy { 105420d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy if ((ping_exclude_tEXt == MagickFalse || 105430d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy ping_exclude_zTXt == MagickFalse) && 105440d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy (ping_exclude_iCCP == MagickFalse || ping_exclude_zCCP == MagickFalse)) 10545c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10546c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp ResetImageProfileIterator(image); 10547c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp for (name=GetNextImageProfile(image); name != (const char *) NULL; ) 105483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10549c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp profile=GetImageProfile(image,name); 105500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10551c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (profile != (StringInfo *) NULL) 10552c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10553c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp#ifdef PNG_WRITE_iCCP_SUPPORTED 10554c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if ((LocaleCompare(name,"ICC") == 0) || 10555c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (LocaleCompare(name,"ICM") == 0)) 1055626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 10557c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp 10558c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_iCCP == MagickFalse) 10559c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10560ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10561ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Setting up iCCP chunk"); 105626647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 1056316ea139d53d867211d3bb0fa859a83de653f687ecristy png_set_iCCP(ping,ping_info,(png_charp) name,0, 10564e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#if (PNG_LIBPNG_VER < 10500) 10565c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_charp) GetStringInfoDatum(profile), 10566e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#else 10567120b581ad9516a43c50caedfa1a8cff418488819Cristy (const png_byte *) GetStringInfoDatum(profile), 10568e4017e34baec05ee0a45800ed8efb2ff6d5c9f5aglennrp#endif 10569c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10570918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP = MagickTrue; 10571c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 1057226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 105730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10574c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp else 105753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 10576c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (ping_exclude_zCCP == MagickFalse) 10577c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp { 10578ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10579ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp " Setting up zTXT chunk with uuencoded ICC"); 10580cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_png_write_raw_profile(image_info,ping,ping_info, 10581c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (unsigned char *) name,(unsigned char *) name, 10582c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp GetStringInfoDatum(profile), 10583c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (png_uint_32) GetStringInfoLength(profile)); 10584ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_iCCP = MagickTrue; 10585c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 10586c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 105870b206f5daa453dc1035db5890cabc899736dc2d0glennrp 10588c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp if (logging != MagickFalse) 10589c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10590c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " Setting up text chunk with %s profile",name); 105910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10592c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp name=GetNextImageProfile(image); 10593c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp } 105940d57eecc316d3f57bd2c77ebbda7fc5fc95f2523cristy } 105953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 105963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 105973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_sRGB_SUPPORTED) 105983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_srgb == 0) && 10599ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp ping_have_iCCP != MagickTrue && 10600ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp (ping_have_sRGB != MagickFalse || 10601ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 106023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1060326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_sRGB == MagickFalse) 1060426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1060526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1060626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image rendering intent. 1060726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1060826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1060926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1061026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up sRGB chunk"); 106110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1061226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) png_set_sRGB(ping,ping_info,( 10613cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 10614cf002022280cc4dedb2748ad6f415aac1d44f530glennrp image->rendering_intent))); 10615918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp 10616918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB = MagickTrue; 1061726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1061926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 106205af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if ((!mng_info->write_mng) || (!png_get_valid(ping,ping_info,PNG_INFO_sRGB))) 106213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 106223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106232cc891a179d622dde7bbb8854138851e828bc6eaglennrp if (ping_exclude_gAMA == MagickFalse && 10624918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_iCCP == MagickFalse && 10625918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp ping_have_sRGB == MagickFalse && 106262cc891a179d622dde7bbb8854138851e828bc6eaglennrp (ping_exclude_sRGB == MagickFalse || 1062726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->gamma < .45 || image->gamma > .46))) 1062826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 106293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->have_write_global_gama == 0) && (image->gamma != 0.0)) 106303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 106313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 106323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Note image gamma. 106333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 106343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 106353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 106363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 106373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Setting up gAMA chunk"); 106383b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 106393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_gAMA(ping,ping_info,image->gamma); 106403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1064126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106422b013e4b9b602533eff410e61c3683fb2a3ab913glennrp 10643918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp if (ping_exclude_cHRM == MagickFalse && ping_have_sRGB == MagickFalse) 106443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1064526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if ((mng_info->have_write_global_chrm == 0) && 1064626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (image->chromaticity.red_primary.x != 0.0)) 1064726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1064826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* 1064926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp Note image chromaticity. 10650918b9dc4bb00c06632ccc6169ea05a828f7b6fc1glennrp Note: if cHRM+gAMA == sRGB write sRGB instead. 1065126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp */ 1065226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PrimaryInfo 1065326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp, 1065426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp, 1065526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp, 1065626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp; 1065726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1065826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp wp=image->chromaticity.white_point; 1065926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp rp=image->chromaticity.red_primary; 1066026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp gp=image->chromaticity.green_primary; 1066126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp=image->chromaticity.blue_primary; 1066226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1066326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1066426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1066526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up cHRM chunk"); 1066626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1066726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_cHRM(ping,ping_info,wp.x,wp.y,rp.x,rp.y,gp.x,gp.y, 1066826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp bp.x,bp.y); 1066926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1067026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 106713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 10672dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 1067326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_bKGD == MagickFalse) 1067426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1067526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_bKGD != MagickFalse) 10676c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 1067726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_bKGD(ping,ping_info,&ping_background); 106788fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 10679c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp { 10680c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10681c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " Setting up bKGD chunk"); 10682c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10683c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " background color = (%d,%d,%d)", 10684c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.red, 10685c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.green, 10686c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.blue); 10687c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10688c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp " index = %d, gray=%d", 10689c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.index, 10690c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp (int) ping_background.gray); 10691c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 10692c6c391a2036b6e500b986d1635c50b9a89ea331dglennrp } 1069326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10694991d11dd9c33e65872778b81aff1347cd2878154glennrp 1069526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_pHYs == MagickFalse) 10696dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1069726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_have_pHYs != MagickFalse) 1069826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1069926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_pHYs(ping,ping_info, 1070026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_x_resolution, 1070126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_y_resolution, 1070226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ping_pHYs_unit_type); 10703823b55c200d7fc1818ab539b036a9c24feaecda8glennrp 107048fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (logging != MagickFalse) 10705823b55c200d7fc1818ab539b036a9c24feaecda8glennrp { 10706823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10707823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " Setting up pHYs chunk"); 10708823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10709823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " x_resolution=%lu", 10710823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_x_resolution); 10711823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10712823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " y_resolution=%lu", 10713823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_y_resolution); 10714823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10715823b55c200d7fc1818ab539b036a9c24feaecda8glennrp " unit_type=%lu", 10716823b55c200d7fc1818ab539b036a9c24feaecda8glennrp (unsigned long) ping_pHYs_unit_type); 10717823b55c200d7fc1818ab539b036a9c24feaecda8glennrp } 1071826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10719dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10720dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10721dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#if defined(PNG_oFFs_SUPPORTED) 107224f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if (ping_exclude_oFFs == MagickFalse) 10723dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp { 1072426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (image->page.x || image->page.y) 1072526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1072626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_set_oFFs(ping,ping_info,(png_int_32) image->page.x, 1072726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (png_int_32) image->page.y, 0); 10728dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 1072926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (logging != MagickFalse) 1073026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1073126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " Setting up oFFs chunk with x=%d, y=%d, units=0", 1073226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (int) image->page.x, (int) image->page.y); 1073326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 10734dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp } 10735dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp#endif 10736dfd7080ae717c8ddb013b59958f2d0790f5e3145glennrp 10737fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#if defined(PNG_tIME_SUPPORTED) 10738fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (ping_exclude_tIME == MagickFalse) 10739fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 10740fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk const char 10741fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk *timestamp; 10742fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 1074339d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (image->taint == MagickFalse) 10744fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk { 1074539d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp timestamp=GetImageOption(image_info,"png:tIME"); 1074639d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1074739d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (timestamp == (const char *) NULL) 10748fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk timestamp=GetImageProperty(image,"png:tIME",exception); 10749fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 1075039d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1075139d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp else 1075239d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp { 1075339d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1075439d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp " Reset tIME in tainted image"); 1075539d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1075639d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp timestamp=GetImageProperty(image,"date:modify",exception); 1075739d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp } 1075839d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp 1075939d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp if (timestamp != (const char *) NULL) 1076039d99e13b7e8233a9ce9fc6d9fd425829426525bglennrp write_tIME_chunk(image,ping,ping_info,timestamp,exception); 10761fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk } 10762fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk#endif 107636647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 10764da8f3a7bfddac2680a3069a490db541e7944edafglennrp if (mng_info->need_blob != MagickFalse) 10765da8f3a7bfddac2680a3069a490db541e7944edafglennrp { 1076616ea139d53d867211d3bb0fa859a83de653f687ecristy if (OpenBlob(image_info,image,WriteBinaryBlobMode,exception) == 10767da8f3a7bfddac2680a3069a490db541e7944edafglennrp MagickFalse) 10768da8f3a7bfddac2680a3069a490db541e7944edafglennrp png_error(ping,"WriteBlob Failed"); 10769da8f3a7bfddac2680a3069a490db541e7944edafglennrp 10770da8f3a7bfddac2680a3069a490db541e7944edafglennrp ping_have_blob=MagickTrue; 10771da8f3a7bfddac2680a3069a490db541e7944edafglennrp } 10772da8f3a7bfddac2680a3069a490db541e7944edafglennrp 107733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info_before_PLTE(ping, ping_info); 10774991d11dd9c33e65872778b81aff1347cd2878154glennrp 1077539992b4dd9b12ef752d55b8e402c069698851f72glennrp if (ping_have_tRNS != MagickFalse && ping_color_type < 4) 10776991d11dd9c33e65872778b81aff1347cd2878154glennrp { 107773b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 107780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 107800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp " Calling png_set_tRNS with num_trans=%d",ping_num_trans); 107810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10782991d11dd9c33e65872778b81aff1347cd2878154glennrp 107830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if (ping_color_type == 3) 107840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 107850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_trans_alpha, 107860fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp ping_num_trans, 107870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL); 10788991d11dd9c33e65872778b81aff1347cd2878154glennrp 107890fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp else 107900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) png_set_tRNS(ping, ping_info, 107920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp NULL, 107930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 0, 107940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp &ping_trans_color); 107950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 107963b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 107970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp { 107980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10799c8cbc5d89664c67b8a8f3f4619fc7ce19ea654bcglennrp " tRNS color =(%d,%d,%d)", 108000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.red, 108010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.green, 108020fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp (int) ping_trans_color.blue); 108030fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 108040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 108050fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp } 10806991d11dd9c33e65872778b81aff1347cd2878154glennrp 108073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any png-chunk-b profiles */ 10808cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-b",logging); 10809da8f3a7bfddac2680a3069a490db541e7944edafglennrp 108103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_info(ping,ping_info); 10811991d11dd9c33e65872778b81aff1347cd2878154glennrp 108123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-m profiles */ 10813cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-m",logging); 108143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1081526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (ping_exclude_vpAg == MagickFalse) 108163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 108174f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp if ((image->page.width != 0 && image->page.width != image->columns) || 108184f25bd0f2f7f8673457c20de30664b5982b57b7cglennrp (image->page.height != 0 && image->page.height != image->rows)) 1081926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1082026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp unsigned char 1082126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[14]; 1082226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1082326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 1082426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGType(chunk,mng_vpAg); 1082503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 1082626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+4,(png_uint_32) image->page.width); 1082726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp PNGLong(chunk+8,(png_uint_32) image->page.height); 1082826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp chunk[12]=0; /* unit = pixels */ 1082926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlob(image,13,chunk); 1083026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 1083126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 108323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 108343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if (PNG_LIBPNG_VER == 10206) 108359c1eb0729653219b9da9037e044501a6dce79d10glennrp /* avoid libpng-1.2.6 bug by setting PNG_HAVE_IDAT flag */ 108363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define PNG_HAVE_IDAT 0x04 108379c1eb0729653219b9da9037e044501a6dce79d10glennrp ping->mode |= PNG_HAVE_IDAT; 108383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#undef PNG_HAVE_IDAT 108393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 108403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 108413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_set_packing(ping); 108423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate memory. 108443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 108453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes=image->columns; 10846b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp if (image_depth > 8) 10847b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 108487202c101b42be63076be56386f79429bb2f39784cristy switch (ping_color_type) 108493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10850b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGB: 108513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=3; 10852b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108530fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10854b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_GRAY_ALPHA: 10855b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp rowbytes*=2; 10856b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108570fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10858b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp case PNG_COLOR_TYPE_RGBA: 108593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy rowbytes*=4; 10860b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10862b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp default: 10863b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp break; 108643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108653b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp 108663b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse) 108673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10868b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10869b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing PNG image data"); 108700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10871b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10872e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Allocating %.20g bytes of memory for pixels",(double) rowbytes); 108733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 108740997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=AcquireVirtualMemory(rowbytes,sizeof(*ping_pixels)); 108750997332e2c35a821b271d6e7473c01c10dc206adcristy if (pixel_info == (MemoryInfo *) NULL) 10876edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Allocation of memory for pixels failed"); 108770997332e2c35a821b271d6e7473c01c10dc206adcristy ping_pixels=(unsigned char *) GetVirtualMemoryBlob(pixel_info); 108780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 108793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 108803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize image scanlines. 108813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 108825f766ef8b0cd9906c2c3a56d845828380a251073cristy quantum_info=AcquireQuantumInfo(image_info,image); 10883ed5525230af20461366cdc5b8bbe0f7f9b166c44cristy if (quantum_info == (QuantumInfo *) NULL) 10884edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping,"Memory allocation for quantum_info failed"); 108853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy quantum_info->format=UndefinedQuantumFormat; 10886e63d2029af2dd8bedf895fdb63d79d0f0f9c2671dirk SetQuantumDepth(image,quantum_info,image_depth); 108874b840d7930c24dbb98f8b9926b8f09f1e1b98970glennrp (void) SetQuantumEndian(image,quantum_info,MSBEndian); 108883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_passes=png_set_interlace_handling(ping); 108898bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 108903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((!mng_info->write_png8 && !mng_info->write_png24 && 10891fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png48 && !mng_info->write_png64 && 108928bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp !mng_info->write_png32) && 108938bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (mng_info->IsPalette || 108943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image_info->type == BilevelType)) && 108958d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp image_matte == MagickFalse && 108968d579660c9b96b7a3f3292fc6c518f8b6ca44d50glennrp ping_have_non_bw == MagickFalse) 108973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 108988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp /* Palette, Bilevel, or Opaque Monochrome */ 1089916ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 109003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 109010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109026e3531932372c9bea14d4a6d1c6eb9026658f9b4Cristy SetQuantumDepth(image,quantum_info,8); 109033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (pass=0; pass < num_passes; pass++) 109043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 109063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Convert PseudoClass image to a PNG monochrome image. 109073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 10908bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 109093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 10910d71e86a4e57997f1aad16e85b542612b1d2f9b6eglennrp if (logging != MagickFalse && y == 0) 109113b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 109123b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp " Writing row of pixels (0)"); 10913a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp 1091416ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 109150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1091616ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 109173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 109180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 109203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1092116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1092216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 109233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 == PNG_COLOR_TYPE_PALETTE && 109243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth && 109253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png_depth != old_bit_depth) 109263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Undo pixel scaling */ 10928bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10929cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) (*(ping_pixels+i) 109303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy >> (8-old_bit_depth)); 109313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 109353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1093616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1093716ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 109383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109390fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype-1 != PNG_COLOR_TYPE_PALETTE) 10941bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->columns; i++) 10942cf002022280cc4dedb2748ad6f415aac1d44f530glennrp *(ping_pixels+i)=(unsigned char) ((*(ping_pixels+i) > 127) ? 109433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 255 : 0); 109440fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109453b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 10946b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 10947b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Writing row of pixels (1)"); 109480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 10949cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 10950af9320404a7b05014476f844b11110157a21b73eglennrp 10951d5a9b370d73940f19035e55634c15c77714031b8dirk status=SetImageProgress(image,SaveImageTag, 10952af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 10953af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1095444c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 10955af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 10956af9320404a7b05014476f844b11110157a21b73eglennrp break; 109573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109618bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* Not Palette, Bilevel, or Opaque Monochrome */ 109623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp if ((!mng_info->write_png8 && !mng_info->write_png24 && 10964fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png48 && !mng_info->write_png64 && 10965fd164d2bf84b111e304959af5698757d60e9b8aeglennrp !mng_info->write_png32) && (image_matte != MagickFalse || 10966fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (ping_bit_depth >= MAGICKCORE_QUANTUM_DEPTH)) && 10967fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (mng_info->IsPalette) && ping_have_color == MagickFalse) 109683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1096916ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 109708bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 109710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 109728bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 109733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109748bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 10975bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (y=0; y < (ssize_t) image->rows; y++) 109763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1097716ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1,exception); 109782cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1097916ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 109803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 109812cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109825af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 109833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 109848bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (mng_info->IsPalette) 1098516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1098616ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 109872cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 1098916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1099016ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 109912cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109928bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 109938bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 109948bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY PNG pixels (2)"); 109953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 109962cc891a179d622dde7bbb8854138851e828bc6eaglennrp 109978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else /* PNG_COLOR_TYPE_GRAY_ALPHA */ 10998b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 109993b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 11000b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110018bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (2)"); 110022cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1100316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1100416ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayAlphaQuantum,ping_pixels,exception); 11005b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 110062cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110073b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 11008b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110098bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (2)"); 110102cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11011cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 110122cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11013d5a9b370d73940f19035e55634c15c77714031b8dirk status=SetImageProgress(image,SaveImageTag, 11014af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11015af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1101644c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 11017af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 11018af9320404a7b05014476f844b11110157a21b73eglennrp break; 110198bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110208bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110218bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 110243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1102516ea139d53d867211d3bb0fa859a83de653f687ecristy register const Quantum 110268bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp *p; 110270fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 110288bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (pass=0; pass < num_passes; pass++) 110293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 11030fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if ((image_depth > 8) || 11031fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 || 110328bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp mng_info->write_png32 || 11033fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || 11034fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 || 11035fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (!mng_info->write_png8 && !mng_info->IsPalette)) 110368bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110378bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 11038b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp { 11039862a33cdfa342ec7df3a7c4b4b46def7c45712b3cristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 110402cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1104116ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 110428bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 110432cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110448bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 110458bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110468bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (image->storage_class == DirectClass) 1104716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1104816ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RedQuantum,ping_pixels,exception); 110492cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110508bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1105116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1105216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 110538bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110542cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110558bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 110568bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1105716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 11058cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1105916ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 110602cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110618bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 110628bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110638bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (3)"); 110648bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110652cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110668bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (image_matte != MagickFalse) 1106716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1106816ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBAQuantum,ping_pixels,exception); 110692cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110708bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 1107116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1107216ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,RGBQuantum,ping_pixels,exception); 110732cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110743b51f0e7f4f7cce3e7466784c8b4e5dac9f55741glennrp if (logging != MagickFalse && y == 0) 11075b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 110768bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing row of pixels (3)"); 110772cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11078cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 11079af9320404a7b05014476f844b11110157a21b73eglennrp 11080d5a9b370d73940f19035e55634c15c77714031b8dirk status=SetImageProgress(image,SaveImageTag, 11081af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11082af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1108344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 11084af9320404a7b05014476f844b11110157a21b73eglennrp if (status == MagickFalse) 11085af9320404a7b05014476f844b11110157a21b73eglennrp break; 11086b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp } 110878bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 110882cc891a179d622dde7bbb8854138851e828bc6eaglennrp 110898bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 11090fd164d2bf84b111e304959af5698757d60e9b8aeglennrp /* not ((image_depth > 8) || 11091fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 || mng_info->write_png32 || 11092fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 || mng_info->write_png64 || 11093fd164d2bf84b111e304959af5698757d60e9b8aeglennrp (!mng_info->write_png8 && !mng_info->IsPalette)) 11094fd164d2bf84b111e304959af5698757d60e9b8aeglennrp */ 110958bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110968bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if ((ping_color_type != PNG_COLOR_TYPE_GRAY) && 110978bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (ping_color_type != PNG_COLOR_TYPE_GRAY_ALPHA)) 110988bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 110998bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse) 111008bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111018bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is not GRAY or GRAY_ALPHA",pass); 111022cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111036e3531932372c9bea14d4a6d1c6eb9026658f9b4Cristy SetQuantumDepth(image,quantum_info,8); 111048bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp image_depth=8; 111058bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 111062cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111078bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp for (y=0; y < (ssize_t) image->rows; y++) 111088640fb5e9b1094f35f8beab436f81661b8a99448glennrp { 111098bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 111108bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111118bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " pass %d, Image Is RGB, 16-bit GRAY, or GRAY_ALPHA",pass); 111122cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1111316ea139d53d867211d3bb0fa859a83de653f687ecristy p=GetVirtualPixels(image,0,y,image->columns,1, exception); 111142cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1111516ea139d53d867211d3bb0fa859a83de653f687ecristy if (p == (const Quantum *) NULL) 111168bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 111172cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111188bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (ping_color_type == PNG_COLOR_TYPE_GRAY) 1111944757ab033a4bc1f272fb26c9a46325ca01a5482glennrp { 111206e3531932372c9bea14d4a6d1c6eb9026658f9b4Cristy SetQuantumDepth(image,quantum_info,image->depth); 111214bf89731a90c6e03598950223e19e7be7b95d630glennrp 1112216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1112316ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,GrayQuantum,ping_pixels,exception); 1112444757ab033a4bc1f272fb26c9a46325ca01a5482glennrp } 111252cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111268bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else if (ping_color_type == PNG_COLOR_TYPE_GRAY_ALPHA) 111278bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 111288bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (logging != MagickFalse && y == 0) 111298bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111308bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp " Writing GRAY_ALPHA PNG pixels (4)"); 111312cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1113216ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 11133cf002022280cc4dedb2748ad6f415aac1d44f530glennrp quantum_info,GrayAlphaQuantum,ping_pixels, 1113416ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 111358bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 111362cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111378bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp else 111388bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp { 1113916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ExportQuantumPixels(image,(CacheView *) NULL, 1114016ea139d53d867211d3bb0fa859a83de653f687ecristy quantum_info,IndexQuantum,ping_pixels,exception); 111412cc891a179d622dde7bbb8854138851e828bc6eaglennrp 111425eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp if (logging != MagickFalse && y <= 2) 111435eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp { 111445eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111451a7d6dbd296698a7cddbc625896987bf674c0cc4glennrp " Writing row of non-gray pixels (4)"); 111465eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp 111475eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111485eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp " ping_pixels[0]=%d,ping_pixels[1]=%d", 111495eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp (int)ping_pixels[0],(int)ping_pixels[1]); 111505eae76090b1e30c1e546508dd1d17711ddd3fcc0glennrp } 111518bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 11152cf002022280cc4dedb2748ad6f415aac1d44f530glennrp png_write_row(ping,ping_pixels); 111532cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11154d5a9b370d73940f19035e55634c15c77714031b8dirk status=SetImageProgress(image,SaveImageTag, 11155af9320404a7b05014476f844b11110157a21b73eglennrp (MagickOffsetType) (pass * image->rows + y), 11156af9320404a7b05014476f844b11110157a21b73eglennrp num_passes * image->rows); 1115744c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 111588bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp if (status == MagickFalse) 111598bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp break; 111608640fb5e9b1094f35f8beab436f81661b8a99448glennrp } 11161af9320404a7b05014476f844b11110157a21b73eglennrp } 111623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111648bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp } 111658bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 11166b32b90a7e1ee2275333589072c496b5f69e17feccristy if (quantum_info != (QuantumInfo *) NULL) 11167b32b90a7e1ee2275333589072c496b5f69e17feccristy quantum_info=DestroyQuantumInfo(quantum_info); 111683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 111693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 111703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11172b4a1341a4d06abe5f603ad9052b6ddc1a667dcd5glennrp " Wrote PNG image data"); 111730fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11175e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Width: %.20g",(double) ping_width); 111760fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11178e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Height: %.20g",(double) ping_height); 111790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_depth) 111813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111835d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:bit-depth: %d",mng_info->write_png_depth); 111843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG bit-depth written: %d",ping_bit_depth); 111880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png_colortype) 111903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 111913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111925d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Defined png:color-type: %d",mng_info->write_png_colortype-1); 111933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 111940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111965af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG color-type written: %d",ping_color_type); 111970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 111983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 111995af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp " PNG Interlace method: %d",ping_interlace_method); 112003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 112013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 11202a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp Generate text chunks after IDAT. 112033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 11204823b55c200d7fc1818ab539b036a9c24feaecda8glennrp if (ping_exclude_tEXt == MagickFalse || ping_exclude_zTXt == MagickFalse) 112053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1120626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp ResetImagePropertyIterator(image); 1120726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1120826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp while (property != (const char *) NULL) 1120926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1121026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp png_textp 1121126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp text; 112122cc891a179d622dde7bbb8854138851e828bc6eaglennrp 1121316ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(image,property,exception); 11214a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11215e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp /* Don't write any "png:" or "jpeg:" properties; those are just for 11216e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp * "identify" or for passing through to another JPEG 11217e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp */ 11218e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp if ((LocaleNCompare(property,"png:",4) != 0 && 11219a3d5f0e19b5d325c69100fcd14fb174a581ee599glennrp LocaleNCompare(property,"jpeg:",5) != 0) && 11220e4d5fafd9fbdf0985a964fe9efee73d5d37ccd44glennrp 11221a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11222a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress density and units if we wrote a pHYs chunk */ 11223a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_pHYs != MagickFalse || 11224823b55c200d7fc1818ab539b036a9c24feaecda8glennrp LocaleCompare(property,"density") != 0 || 11225a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleCompare(property,"units") != 0) && 11226a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 11227a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp /* Suppress the IM-generated Date:create and Date:modify */ 11228a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (ping_exclude_date == MagickFalse || 11229a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp LocaleNCompare(property, "Date:",5) != 0)) 1123026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 11231c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (value != (const char *) NULL) 11232c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 11233a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy 11234ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp#if PNG_LIBPNG_VER >= 10400 11235a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping, 11236a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy (png_alloc_size_t) sizeof(png_text)); 11237a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#else 11238a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy text=(png_textp) png_malloc(ping,(png_size_t) sizeof(png_text)); 11239a865ccd68cbccfdf00a5fdd40bc491c5f5390303cristy#endif 11240c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].key=(char *) property; 11241c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text=(char *) value; 11242c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length=strlen(value); 112432cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11244c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (ping_exclude_tEXt != MagickFalse) 11245c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_zTXt; 112462cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11247c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else if (ping_exclude_zTXt != MagickFalse) 11248c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=PNG_TEXT_COMPRESSION_NONE; 112492cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11250c70af4ac292f8db9a1ab488318912894d412cb8cglennrp else 1125126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 11252c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].compression=image_info->compression == NoCompression || 11253c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (image_info->compression == UndefinedCompression && 11254c70af4ac292f8db9a1ab488318912894d412cb8cglennrp text[0].text_length < 128) ? PNG_TEXT_COMPRESSION_NONE : 11255c70af4ac292f8db9a1ab488318912894d412cb8cglennrp PNG_TEXT_COMPRESSION_zTXt ; 1125626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 112572cc891a179d622dde7bbb8854138851e828bc6eaglennrp 11258c70af4ac292f8db9a1ab488318912894d412cb8cglennrp if (logging != MagickFalse) 11259c70af4ac292f8db9a1ab488318912894d412cb8cglennrp { 11260c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11261c70af4ac292f8db9a1ab488318912894d412cb8cglennrp " Setting up text chunk"); 11262c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 11263c70af4ac292f8db9a1ab488318912894d412cb8cglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11264cbc9215c23fce410bf0bea825dee908c15271bb3glennrp " keyword: '%s'",text[0].key); 11265c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 11266c70af4ac292f8db9a1ab488318912894d412cb8cglennrp 11267c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_set_text(ping,ping_info,text,1); 11268c70af4ac292f8db9a1ab488318912894d412cb8cglennrp png_free(ping,text); 11269c70af4ac292f8db9a1ab488318912894d412cb8cglennrp } 1127026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1127126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp property=GetNextImageProperty(image); 1127226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 112733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 112743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* write any PNG-chunk-e profiles */ 11276cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"PNG-chunk-e",logging); 112773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 112793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 112803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG end info"); 112810fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 112823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_write_end(ping,ping_info); 112830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 112843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && (int) image->dispose == BackgroundDispose) 112853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 112863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.x || mng_info->page.y || 112875af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_width != mng_info->page.width) || 112885af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (ping_height != mng_info->page.height)) 112893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 112903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 112913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[32]; 112923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 112933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 112943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write FRAM 4 with clipping boundaries followed by FRAM 1. 112953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 112963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,27L); /* data length=27 */ 112973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1129803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,27L); 112993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=4; 113003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 113013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=1; /* flag for changing delay, for next frame only */ 113023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 113033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=1; /* flag for changing frame clipping for next frame */ 113043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 113053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) (0L)); /* temporary 0 delay */ 113063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=0; /* clipping boundaries delta type */ 113073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+15,(png_uint_32) (mng_info->page.x)); /* left cb */ 113083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+19, 113095af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.x + ping_width)); 113103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+23,(png_uint_32) (mng_info->page.y)); /* top cb */ 113113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+27, 113125af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp (png_uint_32) (mng_info->page.y + ping_height)); 113133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,31,chunk); 113143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,31)); 113153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=4; 113163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 113173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 113180fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 113193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 113203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 113213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 113223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng && !mng_info->need_fram && 113233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((int) image->dispose == 3)) 11324edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp png_error(ping, "Cannot convert GIF with disposal method 3 to MNG-LC"); 113250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 113263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 113273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Free PNG resources. 113283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 113295af765f10ae9ac5aae02c0b7c213e22a43c0672dglennrp 113303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy png_destroy_write_struct(&ping,&ping_info); 113313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 113320997332e2c35a821b271d6e7473c01c10dc206adcristy pixel_info=RelinquishVirtualMemory(pixel_info); 113333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1133416ea139d53d867211d3bb0fa859a83de653f687ecristy if (ping_have_blob != MagickFalse) 1133516ea139d53d867211d3bb0fa859a83de653f687ecristy (void) CloseBlob(image); 1133616ea139d53d867211d3bb0fa859a83de653f687ecristy 1133716ea139d53d867211d3bb0fa859a83de653f687ecristy image_info=DestroyImageInfo(image_info); 1133816ea139d53d867211d3bb0fa859a83de653f687ecristy image=DestroyImage(image); 1133916ea139d53d867211d3bb0fa859a83de653f687ecristy 11340b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp /* Store bit depth actually written */ 11341b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[0]=(char) ping_bit_depth; 11342b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp s[1]='\0'; 11343b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 1134416ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageProperty(IMimage,"png:bit-depth-written",s,exception); 11345b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp 113463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 113473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 113483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOnePNGImage()"); 113490fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11350868fff35aea4233c40dca33989293cb5bc91601aglennrp#ifdef IMPNG_SETJMP_NOT_THREAD_SAFE 11351edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp UnlockSemaphoreInfo(ping_semaphore); 11352edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp#endif 11353edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 11354edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp /* } for navigation to beginning of SETJMP-protected block. Revert to 11355edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp * Throwing an Exception when an error occurs. 11356edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp */ 11357edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 113583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 113593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* End write one PNG image */ 11360edaa0389d5b58b8460dee2d1e585985ff0d80d31glennrp 113613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 113623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 113633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 113643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e P N G I m a g e % 113693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 113723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 113733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WritePNGImage() writes a Portable Network Graphics (PNG) or 113753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Multiple-image Network Graphics (MNG) image file. 113763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% MNG support written by Glenn Randers-Pehrson, glennrp@image... 113783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WritePNGImage method is: 113803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1138116ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1138216ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 113833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 113853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 113873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 113893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1139016ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1139116ea139d53d867211d3bb0fa859a83de653f687ecristy% 113923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Returns MagickTrue on success, MagickFalse on failure. 113933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Communicating with the PNG encoder: 113953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 113963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% While the datastream written is always in PNG format and normally would 113973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be given the "png" file extension, this method also writes the following 113985d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% pseudo-formats which are subsets of png: 113993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114005a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% o PNG8: An 8-bit indexed PNG datastream is written. If the image has 114015a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% a depth greater than 8, the depth is reduced. If transparency 114023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is present, the tRNS chunk must only have values 0 and 255 114033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% (i.e., transparency is binary: fully opaque or fully 114045a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent). If other values are present they will be 114055a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 50%-thresholded to binary transparency. If more than 256 11406e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% colors are present, they will be quantized to the 4-4-4-1, 11407130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% 3-3-3-1, or 3-3-2-1 palette. The underlying RGB color 11408130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% of any resulting fully-transparent pixels is changed to 11409130fc4535f884af19ec188e80a5cdcd89b0052e0glennrp% the image's background color. 11410e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% 11411e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% If you want better quantization or dithering of the colors 11412e9637cb863ebc78027c145832eaf0b3a62bf2a56glennrp% or alpha than that, you need to do it before calling the 114135a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG encoder. The pixels contain 8-bit indices even if 114145a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% they could be represented with 1, 2, or 4 bits. Grayscale 114153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% images will be written as indexed PNG files even though the 114165a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% PNG grayscale type might be slightly more efficient. Please 114175a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% note that writing to the PNG8 format may result in loss 114185a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% of color and alpha data. 114193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG24: An 8-bit per sample RGB PNG datastream is written. The tRNS 114213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% chunk can be present to convey binary transparency by naming 114225a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% one of the colors as transparent. The only loss incurred 114235a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% is reduction of sample depth to 8. If the image has more 114245a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% than one transparent color, has semitransparent pixels, or 114255a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% has an opaque pixel with the same RGB components as the 114265a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparent color, an image is not written. 114273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o PNG32: An 8-bit per sample RGBA PNG is written. Partial 114293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% transparency is permitted, i.e., the alpha sample for 114303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% each pixel can have any value from 0 to 255. The alpha 114310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% channel is present even if the image is fully opaque. 114325a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% The only loss in data is the reduction of the sample depth 114335a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% to 8. 114343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11435fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% o PNG48: A 16-bit per sample RGB PNG datastream is written. The tRNS 11436fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% chunk can be present to convey binary transparency by naming 11437fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% one of the colors as transparent. If the image has more 11438fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% than one transparent color, has semitransparent pixels, or 11439fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% has an opaque pixel with the same RGB components as the 11440fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% transparent color, an image is not written. 11441fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% 11442fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% o PNG64: A 16-bit per sample RGBA PNG is written. Partial 11443fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% transparency is permitted, i.e., the alpha sample for 11444fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% each pixel can have any value from 0 to 65535. The alpha 11445fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% channel is present even if the image is fully opaque. 11446fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% 114475830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% o PNG00: A PNG that inherits its colortype and bit-depth from the input 114485830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% image, if the input was a PNG, is written. If these values 11449c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% cannot be found, or if the pixels have been changed in a way 11450c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% that makes this impossible, then "PNG00" falls back to the 11451c1e07709d63f88437cf56ddbc6b3889a96711346glennrp% regular "PNG" format. 114525830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp% 114533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o -define: For more precise control of the PNG output, you can use the 114543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Image options "png:bit-depth" and "png:color-type". These 114553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% can be set from the commandline with "-define" and also 11456bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% from the application programming interfaces. The options 11457bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% are case-independent and are converted to lowercase before 11458bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% being passed to this encoder. 114593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:color-type can be 0, 2, 3, 4, or 6. 114613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 0 (Grayscale), png:bit-depth can 114633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, 8, or 16. 114643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 2 (RGB), png:bit-depth can 114663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 8 or 16. 114673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 3 (Indexed), png:bit-depth can 114693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% be 1, 2, 4, or 8. This refers to the number of bits 114703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% used to store the index. The color samples always have 114713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% bit-depth 8 in indexed PNG files. 114723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% When png:color-type is 4 (Gray-Matte) or 6 (RGB-Matte), 114743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% png:bit-depth can be 8 or 16. 114753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11476fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% If the image cannot be written without loss with the 11477fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% requested bit-depth and color-type, a PNG file will not 11478fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% be written, a warning will be issued, and the encoder will 11479fd164d2bf84b111e304959af5698757d60e9b8aeglennrp% return MagickFalse. 114805a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% 114813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Since image encoders should not be responsible for the "heavy lifting", 114823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% the user should make sure that ImageMagick has already reduced the 114833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% image depth and number of colors and limit transparency to binary 114845a39f3714559b4d9c08beb391ce4326354bb0f0cglennrp% transparency prior to attempting to write the image with depth, color, 1148516ea139d53d867211d3bb0fa859a83de653f687ecristy% or transparency limitations. 114863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% Note that another definition, "png:bit-depth-written" exists, but it 114883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% is not intended for external use. It is only used internally by the 114893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% PNG encoder to inform the JNG encoder of the depth of the alpha channel. 114903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% It is possible to request that the PNG encoder write previously-formatted 114923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% ancillary chunks in the output PNG file, using the "-profile" commandline 114933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% option as shown below or by setting the profile via a programming 114943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% interface: 114953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% -profile PNG-chunk-x:<file> 114973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 114983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% where x is a location flag and <file> is a file containing the chunk 114993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% name in the first 4 bytes, then a colon (":"), followed by the chunk data. 11500bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% This encoder will compute the chunk length and CRC, so those must not 11501bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% be included in the file. 115023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 115033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% "x" can be "b" (before PLTE), "m" (middle, i.e., between PLTE and IDAT), 115043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% or "e" (end, i.e., after IDAT). If you want to write multiple chunks 115053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% of the same type, then add a short unique string after the "x" to prevent 11506bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% subsequent profiles from overwriting the preceding ones, e.g., 115073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 11508bb8a733a352d1143bf6e823471ccce72aee8189fglennrp% -profile PNG-chunk-b01:file01 -profile PNG-chunk-b02:file02 115093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 115103241bd0c43e56612fc7aa006a0d30333dacbb51aglennrp% As of version 6.6.6 the following optimizations are always done: 115110fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 11512d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o 32-bit depth is reduced to 16. 115130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o 16-bit depth is reduced to 8 if all pixels contain samples whose 115140fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% high byte and low byte are identical. 115150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Palette is sorted to remove unused entries and to put a 11516cf002022280cc4dedb2748ad6f415aac1d44f530glennrp% transparent color first, if BUILD_PNG_PALETTE is defined. 115170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% o Opaque matte channel is removed when writing an indexed PNG. 11518d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Grayscale images are reduced to 1, 2, or 4 bit depth if 11519d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% this can be done without loss and a larger bit depth N was not 115205d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy% requested via the "-define png:bit-depth=N" option. 11521d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o If matte channel is present but only one transparent color is 11522d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% present, RGB+tRNS is written instead of RGBA 11523d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% o Opaque matte channel is removed (or added, if color-type 4 or 6 11524d6afd54fac7c96376ea623fb7ab6c3e398cb7064glennrp% was requested when converting an opaque image). 115250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp% 115263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 115273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 115283ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info, 1152916ea139d53d867211d3bb0fa859a83de653f687ecristy Image *image,ExceptionInfo *exception) 115303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 115313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1153221f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp excluding, 1153321f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp logging, 1153421f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 115353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 115363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 115383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 115393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 115413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 115423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 115445c7cf4e469a4dad7e277783749155932252c52dfglennrp source; 115455c7cf4e469a4dad7e277783749155932252c52dfglennrp 115463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 115483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 11550e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 115513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 11552e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 115533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 11554fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WritePNGImage()"); 115553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 115573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1155973bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 115600fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 115613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 115623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 115630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 115643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 115653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 115663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 115673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 115683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 11569a521b2fe1f4c8b8ab9412bd6ef23b6736b90e43dglennrp mng_info->equal_backgrounds=MagickTrue; 115703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 115713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* See if user has requested a specific PNG subformat */ 115733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 115743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 115753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 115763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 11577fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48=LocaleCompare(image_info->magick,"PNG48") == 0; 11578fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64=LocaleCompare(image_info->magick,"PNG64") == 0; 115793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11580092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:format"); 11581b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 115825a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp if (value != (char *) NULL || LocaleCompare(image_info->magick,"PNG00") == 0) 11583b381a2618e8bb9e1e76299676711d0ec1063feabglennrp { 11584f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11585f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " Format=%s",value); 11586f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp 11587fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png8 = MagickFalse; 11588fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png24 = MagickFalse; 11589fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png32 = MagickFalse; 11590fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 = MagickFalse; 11591fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 = MagickFalse; 11592fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11593b381a2618e8bb9e1e76299676711d0ec1063feabglennrp if (LocaleCompare(value,"png8") == 0) 11594b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png8 = MagickTrue; 11595b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11596b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png24") == 0) 11597b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png24 = MagickTrue; 11598b381a2618e8bb9e1e76299676711d0ec1063feabglennrp 11599b381a2618e8bb9e1e76299676711d0ec1063feabglennrp else if (LocaleCompare(value,"png32") == 0) 11600b381a2618e8bb9e1e76299676711d0ec1063feabglennrp mng_info->write_png32 = MagickTrue; 11601fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11602fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (LocaleCompare(value,"png48") == 0) 11603fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png48 = MagickTrue; 11604fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11605fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else if (LocaleCompare(value,"png64") == 0) 11606fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png64 = MagickTrue; 116075830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 116085a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if ((LocaleCompare(value,"png00") == 0) || 116095a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp LocaleCompare(image_info->magick,"PNG00") == 0) 116105830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp { 116113398b5b62521b49754d9391aae9e4511857bd63bglennrp /* Retrieve png:IHDR.bit-depth-orig and png:IHDR.color-type-orig. */ 116123398b5b62521b49754d9391aae9e4511857bd63bglennrp value=GetImageProperty(image,"png:IHDR.bit-depth-orig",exception); 116136647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11614f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (value != (char *) NULL) 11615f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp { 11616f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11617f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " png00 inherited bit depth=%s",value); 116186647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11619f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (LocaleCompare(value,"1") == 0) 11620f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 1; 116216647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116225a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if (LocaleCompare(value,"2") == 0) 11623f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 2; 116246647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116255a4989dda1dc69f5b48487088bcc68b78fc4f322glennrp else if (LocaleCompare(value,"4") == 0) 11626f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 4; 116276647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11628f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"8") == 0) 11629f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 8; 116306647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11631f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"16") == 0) 11632f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_depth = 16; 11633f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp } 116346647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 116353398b5b62521b49754d9391aae9e4511857bd63bglennrp value=GetImageProperty(image,"png:IHDR.color-type-orig",exception); 116366647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11637f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (value != (char *) NULL) 11638f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp { 11639f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11640f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp " png00 inherited color type=%s",value); 116416647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11642f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp if (LocaleCompare(value,"0") == 0) 11643f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 1; 116446647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11645f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"2") == 0) 11646f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 3; 116476647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11648f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"3") == 0) 11649f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 4; 116506647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11651f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"4") == 0) 11652f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 5; 116536647b972c570ebc4fa9d4e6ac9a7e4a615adf855glennrp 11654f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp else if (LocaleCompare(value,"6") == 0) 11655f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp mng_info->write_png_colortype = 7; 11656f70c4d28c683ec8266f6a12ce6a7bf6c8a68b798glennrp } 116575830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 116585830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp } 116595830fbc206b62351c31ade8fbe8cbaf259e7036eglennrp 116603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png8) 116613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116629c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 3 */ 4; 116639c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116649c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 116653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png24) 116683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116699c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 2 */ 3; 116709c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116719c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 116720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1167317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 11674def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 116750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 116769c1eb0729653219b9da9037e044501a6dce79d10glennrp else 1167716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(image,TrueColorType,exception); 116780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1167916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 116803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 116823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_png32) 116833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 116849c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = /* 6 */ 7; 116859c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 116869c1eb0729653219b9da9037e044501a6dce79d10glennrp image->depth = 8; 1168747da46dca23c0c6f51670977d82dce24204c5693dirk image->alpha_trait = BlendPixelTrait; 116880fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11689def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 1169016ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SyncImage(image,exception); 116913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 116923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 11693fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png48) 11694fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 11695fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype = /* 2 */ 3; 11696fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_depth = 16; 11697fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image->depth = 16; 11698fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 1169917f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 11700def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 11701fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11702fd164d2bf84b111e304959af5698757d60e9b8aeglennrp else 117034dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SetImageType(image,TrueColorType,exception); 11704fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 117054dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SyncImage(image,exception); 11706fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 11707fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11708fd164d2bf84b111e304959af5698757d60e9b8aeglennrp if (mng_info->write_png64) 11709fd164d2bf84b111e304959af5698757d60e9b8aeglennrp { 11710fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_colortype = /* 6 */ 7; 11711fd164d2bf84b111e304959af5698757d60e9b8aeglennrp mng_info->write_png_depth = 16; 11712fd164d2bf84b111e304959af5698757d60e9b8aeglennrp image->depth = 16; 1171347da46dca23c0c6f51670977d82dce24204c5693dirk image->alpha_trait = BlendPixelTrait; 11714fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11715def23e5d7331b1a13ed593b6d6aca516da382328cristy (void) SetImageType(image,TrueColorAlphaType,exception); 117164dda64fa7c4d4967629a7138cc7a9ce1db4b915eglennrp (void) SyncImage(image,exception); 11717fd164d2bf84b111e304959af5698757d60e9b8aeglennrp } 11718fd164d2bf84b111e304959af5698757d60e9b8aeglennrp 11719092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:bit-depth"); 117208bb3a02a0021145f36ed1057d3153c74abdcabaeglennrp 117213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 117223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 117233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"1") == 0) 117249c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 1; 117250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 117279c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 2; 117280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 117309c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 4; 117310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"8") == 0) 117339c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 8; 117340fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"16") == 0) 117369c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_depth = 16; 117370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11738bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1173916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11740bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11741bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:bit-depth", 11742bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11743bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 117443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117459c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11746bb8a733a352d1143bf6e823471ccce72aee8189fglennrp " png:bit-depth=%d was defined.\n",mng_info->write_png_depth); 117473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 117480fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11749092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:color-type"); 117500fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 117523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 117533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* We must store colortype+1 because 0 is a valid colortype */ 117543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (LocaleCompare(value,"0") == 0) 117559c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 1; 117560fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1175716ea139d53d867211d3bb0fa859a83de653f687ecristy else if (LocaleCompare(value,"1") == 0) 1175816ea139d53d867211d3bb0fa859a83de653f687ecristy mng_info->write_png_colortype = 2; 1175916ea139d53d867211d3bb0fa859a83de653f687ecristy 117603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"2") == 0) 117619c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 3; 117620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"3") == 0) 117649c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 4; 117650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"4") == 0) 117679c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 5; 117680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 117693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else if (LocaleCompare(value,"6") == 0) 117709c1eb0729653219b9da9037e044501a6dce79d10glennrp mng_info->write_png_colortype = 7; 117710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 11772bb8a733a352d1143bf6e823471ccce72aee8189fglennrp else 1177316ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 11774bb8a733a352d1143bf6e823471ccce72aee8189fglennrp GetMagickModule(),CoderWarning, 11775bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "ignoring invalid defined png:color-type", 11776bb8a733a352d1143bf6e823471ccce72aee8189fglennrp "=%s",value); 11777bb8a733a352d1143bf6e823471ccce72aee8189fglennrp 117783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 117799c1eb0729653219b9da9037e044501a6dce79d10glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 11780d6bf1617e99df0272b231855a933a74e99b6578fglennrp " png:color-type=%d was defined.\n",mng_info->write_png_colortype-1); 117813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 117823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 117830e8ea19baa0666ccfe869d19116372f60fe9230fglennrp /* Check for chunks to be excluded: 117840e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117850dff56c31fb2f5daa9744018ca533e387c246afcglennrp * The default is to not exclude any known chunks except for any 117860e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * listed in the "unused_chunks" array, above. 117870e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117885d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * Chunks can be listed for exclusion via a "png:exclude-chunk" 117890e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * define (in the image properties or in the image artifacts) 117900e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or via a mng_info member. For convenience, in addition 117910e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * to or instead of a comma-separated list of chunks, the 117920e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string can be simply "all" or "none". 117930e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117940e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The exclude-chunk define takes priority over the mng_info. 117950e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 117965d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * A "png:include-chunk" define takes priority over both the 117975d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy * mng_info and the "png:exclude-chunk" define. Like the 117980e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * "exclude-chunk" string, it can define "all" or "none" as 117990dff56c31fb2f5daa9744018ca533e387c246afcglennrp * well as a comma-separated list. Chunks that are unknown to 118000dff56c31fb2f5daa9744018ca533e387c246afcglennrp * ImageMagick are always excluded, regardless of their "copy-safe" 118010dff56c31fb2f5daa9744018ca533e387c246afcglennrp * status according to the PNG specification, and even if they 11802aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * appear in the "include-chunk" list. Such defines appearing among 11803aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * the image options take priority over those found among the image 11804aa192b15c78ecafb5ee45ea185519ba2cf4e1f60glennrp * artifacts. 118050e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118060e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * Finally, all chunks listed in the "unused_chunks" array are 118070e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * automatically excluded, regardless of the other instructions 118080e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * or lack thereof. 118090e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118100e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * if you exclude sRGB but not gAMA (recommended), then sRGB chunk 118110e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * will not be written and the gAMA chunk will only be written if it 118120e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is not between .45 and .46, or approximately (1.0/2.2). 118130e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118140e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * If you exclude tRNS and the image has transparency, the colortype 118150e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * is forced to be 4 or 6 (GRAY_ALPHA or RGB_ALPHA). 118160e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * 118170e8ea19baa0666ccfe869d19116372f60fe9230fglennrp * The -strip option causes StripImage() to set the png:include-chunk 11818104f206c40efbb0a0eeba846672009345423e969glennrp * artifact to "none,trns,gama". 118190e8ea19baa0666ccfe869d19116372f60fe9230fglennrp */ 118200e8ea19baa0666ccfe869d19116372f60fe9230fglennrp 1182126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_bKGD=MagickFalse; 1182226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_cHRM=MagickFalse; 11823a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickFalse; 1182426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_EXIF=MagickFalse; /* hex-encoded EXIF in zTXt */ 1182526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_gAMA=MagickFalse; 1182626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_iCCP=MagickFalse; 1182726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp /* mng_info->ping_exclude_iTXt=MagickFalse; */ 1182826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_oFFs=MagickFalse; 1182926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_pHYs=MagickFalse; 1183026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_sRGB=MagickFalse; 1183126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_tEXt=MagickFalse; 11832fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=MagickFalse; 11833a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickFalse; 1183426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_vpAg=MagickFalse; 1183526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zCCP=MagickFalse; /* hex-encoded iCCP in zTXt */ 1183626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp mng_info->ping_exclude_zTXt=MagickFalse; 1183726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 118388d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickFalse; 118398d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 11840092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:preserve-colormap"); 118418d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value == NULL) 118428b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:preserve-colormap"); 118438d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp if (value != NULL) 118448d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap=MagickTrue; 118458d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp 11846ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp mng_info->ping_preserve_iCCP=MagickFalse; 11847ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 11848ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp value=GetImageOption(image_info,"png:preserve-iCCP"); 11849ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (value == NULL) 11850ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp value=GetImageArtifact(image,"png:preserve-iCCP"); 11851ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp if (value != NULL) 11852ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp mng_info->ping_preserve_iCCP=MagickTrue; 11853ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp 11854ecab7d7b7fc598881ff3c72240381caa5c444a56glennrp /* These compression-level, compression-strategy, and compression-filter 118551868258559ddf946fa73ef72dd43507b32623705glennrp * defines take precedence over values from the -quality option. 118561868258559ddf946fa73ef72dd43507b32623705glennrp */ 11857092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-level"); 118581868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 118598b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-level"); 118601868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 118611868258559ddf946fa73ef72dd43507b32623705glennrp { 118621868258559ddf946fa73ef72dd43507b32623705glennrp /* We have to add 1 to everything because 0 is a valid input, 118631868258559ddf946fa73ef72dd43507b32623705glennrp * and we want to use 0 (the default) to mean undefined. 118641868258559ddf946fa73ef72dd43507b32623705glennrp */ 118651868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 118661868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 1; 118671868258559ddf946fa73ef72dd43507b32623705glennrp 118680ffb95c048e16be4f2a8d6aaa76de1dfd7775124glennrp else if (LocaleCompare(value,"1") == 0) 118691868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 2; 118701868258559ddf946fa73ef72dd43507b32623705glennrp 118711868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 118721868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 3; 118731868258559ddf946fa73ef72dd43507b32623705glennrp 118741868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 118751868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 4; 118761868258559ddf946fa73ef72dd43507b32623705glennrp 118771868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 118781868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 5; 118791868258559ddf946fa73ef72dd43507b32623705glennrp 118801868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 118811868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 6; 118821868258559ddf946fa73ef72dd43507b32623705glennrp 118831868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"6") == 0) 118841868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 7; 118851868258559ddf946fa73ef72dd43507b32623705glennrp 118861868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"7") == 0) 118871868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 8; 118881868258559ddf946fa73ef72dd43507b32623705glennrp 118891868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"8") == 0) 118901868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 9; 118911868258559ddf946fa73ef72dd43507b32623705glennrp 118921868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"9") == 0) 118931868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_level = 10; 118941868258559ddf946fa73ef72dd43507b32623705glennrp 118951868258559ddf946fa73ef72dd43507b32623705glennrp else 1189616ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 118971868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 118981868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-level", 118991868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 119001868258559ddf946fa73ef72dd43507b32623705glennrp } 119011868258559ddf946fa73ef72dd43507b32623705glennrp 11902092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-strategy"); 119031868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 119048b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-strategy"); 119051868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 119061868258559ddf946fa73ef72dd43507b32623705glennrp { 119071868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 119081868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 119091868258559ddf946fa73ef72dd43507b32623705glennrp 119101868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"1") == 0) 119111868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FILTERED+1; 119121868258559ddf946fa73ef72dd43507b32623705glennrp 119131868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 119141868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_HUFFMAN_ONLY+1; 119151868258559ddf946fa73ef72dd43507b32623705glennrp 119161868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 1191798c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_RLE /* Z_RLE was added to zlib-1.2.0 */ 119181868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_RLE+1; 1191998c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1192098c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1192198c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 119221868258559ddf946fa73ef72dd43507b32623705glennrp 119231868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 1192498c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#ifdef Z_FIXED /* Z_FIXED was added to zlib-1.2.2.2 */ 119251868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_strategy = Z_FIXED+1; 1192698c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#else 1192798c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp mng_info->write_png_compression_strategy = Z_DEFAULT_STRATEGY+1; 1192898c07ad97d2b2c4571ec3b58241df30d43ba51d0glennrp#endif 119291868258559ddf946fa73ef72dd43507b32623705glennrp 119301868258559ddf946fa73ef72dd43507b32623705glennrp else 1193116ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 119321868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 119331868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-strategy", 119341868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 119351868258559ddf946fa73ef72dd43507b32623705glennrp } 119361868258559ddf946fa73ef72dd43507b32623705glennrp 11937092ec8d083fedaedfb7792995e7ea42164553cffcristy value=GetImageOption(image_info,"png:compression-filter"); 119381868258559ddf946fa73ef72dd43507b32623705glennrp if (value == NULL) 119398b206bac411969018dc3a6d395f525f1664af412cristy value=GetImageArtifact(image,"png:compression-filter"); 119401868258559ddf946fa73ef72dd43507b32623705glennrp if (value != NULL) 119411868258559ddf946fa73ef72dd43507b32623705glennrp { 119421868258559ddf946fa73ef72dd43507b32623705glennrp /* To do: combinations of filters allowed by libpng 119431868258559ddf946fa73ef72dd43507b32623705glennrp * masks 0x08 through 0xf8 119441868258559ddf946fa73ef72dd43507b32623705glennrp * 119451868258559ddf946fa73ef72dd43507b32623705glennrp * Implement this as a comma-separated list of 0,1,2,3,4,5 119461868258559ddf946fa73ef72dd43507b32623705glennrp * where 5 is a special case meaning PNG_ALL_FILTERS. 119471868258559ddf946fa73ef72dd43507b32623705glennrp */ 119481868258559ddf946fa73ef72dd43507b32623705glennrp 119491868258559ddf946fa73ef72dd43507b32623705glennrp if (LocaleCompare(value,"0") == 0) 119501868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 1; 119511868258559ddf946fa73ef72dd43507b32623705glennrp 11952b19b8125320afb5954bd73b82d00700e8ed9e984cristy else if (LocaleCompare(value,"1") == 0) 119531868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 2; 119541868258559ddf946fa73ef72dd43507b32623705glennrp 119551868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"2") == 0) 119561868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 3; 119571868258559ddf946fa73ef72dd43507b32623705glennrp 119581868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"3") == 0) 119591868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 4; 119601868258559ddf946fa73ef72dd43507b32623705glennrp 119611868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"4") == 0) 119621868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 5; 119631868258559ddf946fa73ef72dd43507b32623705glennrp 119641868258559ddf946fa73ef72dd43507b32623705glennrp else if (LocaleCompare(value,"5") == 0) 119651868258559ddf946fa73ef72dd43507b32623705glennrp mng_info->write_png_compression_filter = 6; 119661868258559ddf946fa73ef72dd43507b32623705glennrp 119671868258559ddf946fa73ef72dd43507b32623705glennrp else 1196816ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception, 119691868258559ddf946fa73ef72dd43507b32623705glennrp GetMagickModule(),CoderWarning, 119701868258559ddf946fa73ef72dd43507b32623705glennrp "ignoring invalid defined png:compression-filter", 119711868258559ddf946fa73ef72dd43507b32623705glennrp "=%s",value); 119721a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 1197303812ae402fb53d548f0e1d7d14720768f803c2dglennrp 119741a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp for (source=0; source<8; source++) 119755c7cf4e469a4dad7e277783749155932252c52dfglennrp { 119761a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp value = NULL; 11977acba004f7fac1660554dfefd2a078ead5ac8ee14glennrp 119782dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 0) 119792dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:exclude-chunks"); 119802dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119812dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 1) 119822dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:exclude-chunks"); 119832dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119842dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 2) 119852dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:exclude-chunk"); 119862dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119872dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 3) 119882dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:exclude-chunk"); 119892dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119902dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 4) 119912dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:include-chunks"); 119922dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119932dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 5) 119942dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:include-chunks"); 119952dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119962dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 6) 119972dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageOption(image_info,"png:include-chunk"); 119982dd1906783a5ece58a6105b4f59239e28b13caddglennrp 119992dd1906783a5ece58a6105b4f59239e28b13caddglennrp if (source == 7) 120002dd1906783a5ece58a6105b4f59239e28b13caddglennrp value=GetImageArtifact(image,"png:include-chunk"); 1200126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 120021a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (value == NULL) 120031a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp continue; 120041a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp 120051a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (source < 4) 120061a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp excluding = MagickTrue; 120071a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else 120081a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp excluding = MagickFalse; 1200926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 1201003812ae402fb53d548f0e1d7d14720768f803c2dglennrp if (logging != MagickFalse) 120112cc891a179d622dde7bbb8854138851e828bc6eaglennrp { 120121a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (source == 0 || source == 2) 120131a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120141a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:exclude-chunk=%s found in image options.\n", value); 120151a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else if (source == 1 || source == 3) 120162cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120172cc891a179d622dde7bbb8854138851e828bc6eaglennrp " png:exclude-chunk=%s found in image artifacts.\n", value); 120181a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else if (source == 4 || source == 6) 120192cc891a179d622dde7bbb8854138851e828bc6eaglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120201a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:include-chunk=%s found in image options.\n", value); 120211a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp else /* if (source == 5 || source == 7) */ 120221a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 120231a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp " png:include-chunk=%s found in image artifacts.\n", value); 120242cc891a179d622dde7bbb8854138851e828bc6eaglennrp } 1202503812ae402fb53d548f0e1d7d14720768f803c2dglennrp 120261a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (IsOptionMember("all",value) != MagickFalse) 120271a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp { 120281a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_bKGD=excluding; 120291a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_cHRM=excluding; 120301a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_date=excluding; 120311a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_EXIF=excluding; 120321a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_gAMA=excluding; 120331a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iCCP=excluding; 120341a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp /* mng_info->ping_exclude_iTXt=excluding; */ 120351a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_oFFs=excluding; 120361a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_pHYs=excluding; 120371a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_sRGB=excluding; 120381a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tEXt=excluding; 12039fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding; 120401a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tRNS=excluding; 120411a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_vpAg=excluding; 120421a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zCCP=excluding; 120431a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zTXt=excluding; 120441a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 12045280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp 12046689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("none",value) != MagickFalse) 120471a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp { 12048a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_bKGD=excluding != MagickFalse ? MagickFalse : 12049a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12050a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_cHRM=excluding != MagickFalse ? MagickFalse : 12051a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12052a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_date=excluding != MagickFalse ? MagickFalse : 12053a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12054a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_EXIF=excluding != MagickFalse ? MagickFalse : 12055a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12056a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_gAMA=excluding != MagickFalse ? MagickFalse : 12057a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12058a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_iCCP=excluding != MagickFalse ? MagickFalse : 12059a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 120601a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp /* mng_info->ping_exclude_iTXt=!excluding; */ 12061a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_oFFs=excluding != MagickFalse ? MagickFalse : 12062a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12063a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_pHYs=excluding != MagickFalse ? MagickFalse : 12064a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12065a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_sRGB=excluding != MagickFalse ? MagickFalse : 12066a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12067a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_tEXt=excluding != MagickFalse ? MagickFalse : 12068a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12069fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding != MagickFalse ? MagickFalse : 12070fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk MagickTrue; 12071a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_tRNS=excluding != MagickFalse ? MagickFalse : 12072a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12073a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_vpAg=excluding != MagickFalse ? MagickFalse : 12074a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12075a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_zCCP=excluding != MagickFalse ? MagickFalse : 12076a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 12077a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy mng_info->ping_exclude_zTXt=excluding != MagickFalse ? MagickFalse : 12078a20c8fe839f466073b171f5a6fd16fdf9a8bd0edcristy MagickTrue; 120791a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp } 1208003812ae402fb53d548f0e1d7d14720768f803c2dglennrp 12081689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("bkgd",value) != MagickFalse) 120821a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_bKGD=excluding; 120832cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12084689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("chrm",value) != MagickFalse) 120851a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_cHRM=excluding; 12086a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp 12087689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("date",value) != MagickFalse) 120881a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_date=excluding; 120892cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12090689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("exif",value) != MagickFalse) 120911a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_EXIF=excluding; 120922cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12093689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("gama",value) != MagickFalse) 120941a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_gAMA=excluding; 120952cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12096689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("iccp",value) != MagickFalse) 120971a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iCCP=excluding; 120982cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12099689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#if 0 12100689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("itxt",value) != MagickFalse) 121011a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_iTXt=excluding; 12102689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#endif 121032cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12104689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("offs",value) != MagickFalse) 121051a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_oFFs=excluding; 121062cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12107689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("phys",value) != MagickFalse) 121081a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_pHYs=excluding; 121092cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12110689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("srgb",value) != MagickFalse) 121111a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_sRGB=excluding; 121122cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12113689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("text",value) != MagickFalse) 121141a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tEXt=excluding; 121152cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12116fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (IsOptionMember("time",value) != MagickFalse) 12117fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk mng_info->ping_exclude_tIME=excluding; 12118fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk 12119689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("trns",value) != MagickFalse) 121201a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_tRNS=excluding; 12121a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp 12122689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("vpag",value) != MagickFalse) 121231a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_vpAg=excluding; 121242cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12125689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("zccp",value) != MagickFalse) 121261a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zCCP=excluding; 121272cc891a179d622dde7bbb8854138851e828bc6eaglennrp 12128689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp if (IsOptionMember("ztxt",value) != MagickFalse) 121291a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp mng_info->ping_exclude_zTXt=excluding; 1213026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1213126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 121321a506acce0fc50a6bbb35b1c04e7e51c1f7129f3glennrp if (logging != MagickFalse) 1213326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp { 1213426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 121355d6fc9c70199232d90da3ceaf6933100fe2c25d4cristy " Chunks to be excluded from the output png:"); 1213626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_bKGD != MagickFalse) 1213726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1213826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " bKGD"); 1213926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_cHRM != MagickFalse) 1214026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1214126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " cHRM"); 12142a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp if (mng_info->ping_exclude_date != MagickFalse) 12143a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12144a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp " date"); 1214526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_EXIF != MagickFalse) 1214626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1214726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " EXIF"); 1214826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_gAMA != MagickFalse) 1214926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " gAMA"); 1215126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iCCP != MagickFalse) 1215226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iCCP"); 12154689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#if 0 1215526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_iTXt != MagickFalse) 1215626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1215726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " iTXt"); 12158689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp#endif 12159689efa2792fc00b3418a812abcdc9bb76e5293b0glennrp 1216026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_oFFs != MagickFalse) 1216126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1216226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " oFFs"); 1216326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_pHYs != MagickFalse) 1216426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1216526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " pHYs"); 1216626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_sRGB != MagickFalse) 1216726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1216826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " sRGB"); 1216926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_tEXt != MagickFalse) 1217026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1217126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " tEXt"); 12172fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk if (mng_info->ping_exclude_tIME != MagickFalse) 12173fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12174fd6fd07e58e3d37313bec849313ac6e2b92e3957dirk " tIME"); 12175a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp if (mng_info->ping_exclude_tRNS != MagickFalse) 12176a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12177a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp " tRNS"); 1217826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_vpAg != MagickFalse) 1217926f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1218026f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " vpAg"); 1218126f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zCCP != MagickFalse) 1218226f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1218326f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zCCP"); 1218426f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp if (mng_info->ping_exclude_zTXt != MagickFalse) 1218526f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1218626f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp " zTXt"); 1218726f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp } 1218826f379198a1c94db76f302873c7f1f2e8d5ec6a0glennrp 12189b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickTrue; 121903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1219116ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 121923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 121933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 121940fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 121963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WritePNGImage()"); 121970fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 121983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 121993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 122003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 122023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* Write one JNG image */ 122043ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteOneJNGImage(MngInfo *mng_info, 1220516ea139d53d867211d3bb0fa859a83de653f687ecristy const ImageInfo *image_info,Image *image,ExceptionInfo *exception) 122063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 122073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 122083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image; 122093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 122113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *jpeg_image_info; 122123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1221403812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 122153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 122163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 122183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 122193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 122213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *blob, 122223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[80], 122233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 122243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 122263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_compression_method, 122273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth, 122283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type, 122293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy transparent; 122303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12231bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 1223259575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality, 122333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_quality; 122343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy logging=LogMagickEvent(CoderEvent,GetMagickModule(), 12236fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp " Enter WriteOneJNGImage()"); 122373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) NULL; 122393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=(Image *) NULL; 122403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) NULL; 122417e99a06aa771c9e270e7940731dbf9f2ab2c09b1glennrp length=0; 122423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=MagickTrue; 12244def23e5d7331b1a13ed593b6d6aca516da382328cristy transparent=image_info->type==GrayscaleAlphaType || 1224544c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp image_info->type==TrueColorAlphaType || 1224644c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp image->alpha_trait != UndefinedPixelTrait; 122473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122484b917593e694424be469d250448c05c878663812glennrp jng_alpha_sample_depth = 0; 122494b917593e694424be469d250448c05c878663812glennrp 1225059575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_quality=image_info->quality == 0UL ? 75UL : image_info->quality%1000; 1225159575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1225259575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=image->compression==JPEGCompression? 8 : 0; 1225359575fa5c228308a41d7f5028390be2083aaaf6dglennrp 12254750105bf9b66a5a86aca655f78c493202bf8f5c2glennrp jng_alpha_quality=image_info->quality == 0UL ? 75UL : 1225559575fa5c228308a41d7f5028390be2083aaaf6dglennrp image_info->quality; 1225659575fa5c228308a41d7f5028390be2083aaaf6dglennrp 1225759575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (jng_alpha_quality >= 1000) 1225859575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_quality /= 1000; 122593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12260d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp length=0; 12261d0ee5a2a5576be4065e1e4d9dbdd97da0ade7a9bglennrp 122628fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 122633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 122643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type=14; 122650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Create JPEG blob, image, and image_info */ 122673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 122683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1226916ea139d53d867211d3bb0fa859a83de653f687ecristy " Creating jpeg_image_info for alpha."); 122700fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 122720fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 122743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 122750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 122763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 122773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 122783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 122790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1228016ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=SeparateImage(image,AlphaChannel,exception); 122813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 122823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 12283151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 122848a46d827a124555f0c48fb2368ec1bba8e079ab6cristy jpeg_image->alpha_trait=UndefinedPixelTrait; 122858f77fdc7ab98b7b964922604fc7822d8b7fe8ec2glennrp jpeg_image->quality=jng_alpha_quality; 1228616ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image_info->type=GrayscaleType; 1228716ea139d53d867211d3bb0fa859a83de653f687ecristy (void) SetImageType(jpeg_image,GrayscaleType,exception); 122883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 12289151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(jpeg_image_info->filename,MagickPathExtent, 122903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy "%s",jpeg_image->filename); 122913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1229259575fa5c228308a41d7f5028390be2083aaaf6dglennrp else 1229359575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1229459575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_compression_method=0; 1229559575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_color_type=10; 1229659575fa5c228308a41d7f5028390be2083aaaf6dglennrp jng_alpha_sample_depth=0; 1229759575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 122983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 122993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: check bit depth of PNG alpha channel */ 123003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Check if image is grayscale. */ 12302def23e5d7331b1a13ed593b6d6aca516da382328cristy if (image_info->type != TrueColorAlphaType && image_info->type != 12303f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk TrueColorType && SetImageGray(image,exception)) 123043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_color_type-=2; 123053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1230659575fa5c228308a41d7f5028390be2083aaaf6dglennrp if (logging != MagickFalse) 1230759575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1230859575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1230959575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Quality = %d",(int) jng_quality); 1231059575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1231159575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Color Type = %d",jng_color_type); 123128fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 1231359575fa5c228308a41d7f5028390be2083aaaf6dglennrp { 1231459575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1231559575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Compression = %d",jng_alpha_compression_method); 1231659575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1231759575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Depth = %d",jng_alpha_sample_depth); 1231859575fa5c228308a41d7f5028390be2083aaaf6dglennrp (void) LogMagickEvent(CoderEvent,GetMagickModule(), 1231959575fa5c228308a41d7f5028390be2083aaaf6dglennrp " JNG Alpha Quality = %d",(int) jng_alpha_quality); 1232059575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1232159575fa5c228308a41d7f5028390be2083aaaf6dglennrp } 1232259575fa5c228308a41d7f5028390be2083aaaf6dglennrp 123238fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 123243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 123253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 123263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 123273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 123283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *value; 123293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1233016ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale PNG blob */ 123313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1233216ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 1233344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1233444c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1233544c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 123363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 123383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating PNG blob."); 123393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12340151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"PNG",MagickPathExtent); 12341151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"PNG",MagickPathExtent); 123423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 123433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12344cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp /* Exclude all ancillary chunks */ 12345cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp (void) SetImageArtifact(jpeg_image,"png:exclude-chunks","all"); 12346cc5d45ba3d6a1494b0c655f29e95f8eeac659acbglennrp 12347b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image, 12348b3f97ae45019a91b30792a6fa42d81a2689a7025cristy &length,exception); 123493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Retrieve sample depth used */ 1235116ea139d53d867211d3bb0fa859a83de653f687ecristy value=GetImageProperty(jpeg_image,"png:bit-depth-written",exception); 123523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (value != (char *) NULL) 123533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth= (unsigned int) value[0]; 123543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 123563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1235716ea139d53d867211d3bb0fa859a83de653f687ecristy /* Encode alpha as a grayscale JPEG blob */ 123583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1236016ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 1236144c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1236244c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1236344c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 123643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12365151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MagickPathExtent); 12366151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 123673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->interlace=NoInterlace; 123683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 123703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 12371b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image,&length, 1237216ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 123733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jng_alpha_sample_depth=8; 123740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 123753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 123763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12377e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 12378e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 123793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Destroy JPEG image and image_info */ 123823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 123833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 123843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 123853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 123863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 123873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JHDR chunk */ 123883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,16L); /* chunk data length=16 */ 123893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JHDR); 1239003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JHDR,16L); 123914e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) image->columns); 123924e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) image->rows); 123933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=jng_color_type; 123943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[13]=8; /* sample depth */ 123953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[14]=8; /*jng_image_compression_method */ 123963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[15]=(unsigned char) (image_info->interlace == NoInterlace ? 0 : 8); 123973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[16]=jng_alpha_sample_depth; 123983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[17]=jng_alpha_compression_method; 123993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[18]=0; /*jng_alpha_filter_method */ 124003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[19]=0; /*jng_alpha_interlace_method */ 124013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,20,chunk); 124023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,20)); 124033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 124043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12406f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG width:%15lu",(unsigned long) image->columns); 124070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12409f2faecf9facdbbb14fcba373365f9f691a9658e0cristy " JNG height:%14lu",(unsigned long) image->rows); 124100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG color type:%10d",jng_color_type); 124130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG sample depth:%8d",8); 124160fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG compression:%9d",8); 124190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG interlace:%11d",0); 124220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha depth:%9d",jng_alpha_sample_depth); 124250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha compression:%3d",jng_alpha_compression_method); 124280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha filter:%8d",0); 124310fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 124333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " JNG alpha interlace:%5d",0); 124343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124360fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp /* Write any JNG-chunk-b profiles */ 12437cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-b",logging); 124383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write leading ancillary chunks 124413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124438fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 124443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG bKGD chunk 124473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 124503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue, 124513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 124523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red; 124533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12454bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 124553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes; 124563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 124583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=6L; 124593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 124603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy num_bytes=10L; 12461bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) (num_bytes-4L)); 124623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1246303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,(size_t) (num_bytes-4L)); 124643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToChar(image->background_color.red); 124653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToChar(image->background_color.green); 124663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToChar(image->background_color.blue); 124673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+4)=0; 124683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+5)=red; 124693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+6)=0; 124703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+7)=green; 124713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+8)=0; 124723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *(chunk+9)=blue; 124733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,(size_t) num_bytes,chunk); 124743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) num_bytes)); 124753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 124773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent)) 124783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 124793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 124803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG sRGB chunk 124813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 124823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 124833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1248403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 124850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 12487e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12488cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12489e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 124900fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 12492e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 12493cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 12494e610a071534e448c46460a5aa39ede33bf56b329glennrp (PerceptualIntent)); 124950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 124963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 124973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 124983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 124993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 125003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma != 0.0) 125023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG gAMA chunk 125053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 125073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1250803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1250935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 125103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 125113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 125123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->equal_chrms == MagickFalse) && 125153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->chromaticity.red_primary.x != 0.0)) 125163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 125183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 125193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG cHRM chunk 125223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 125243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1252503812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 125263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1252735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1252835ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 125293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1253035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1253135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 125323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1253335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1253435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 125353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1253635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1253735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 125383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 125393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 125403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1254316ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && !mng_info->equal_physs) 125443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG pHYs chunk 125473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 125493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1255003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 125513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 125523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1255335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1255416ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 125550fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1255635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1255716ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 125580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 125603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125610fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 125633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 125653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1256635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1256716ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 125680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1256935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1257016ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 125710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 125733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125740fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 125753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 125763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1257716ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1257816ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 125793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 125803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 125833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 125843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 125853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 125863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.x || image->page.y)) 125873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 125883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 125893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write JNG oFFs chunk 125903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 125913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 125923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_oFFs); 1259303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_oFFs,9L); 12594bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+4,(ssize_t) (image->page.x)); 12595bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy PNGsLong(chunk+8,(ssize_t) (image->page.y)); 125963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 125973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 125983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 125993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->write_mng == 0 && (image->page.width || image->page.height)) 126013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); /* data length=8 */ 126033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_vpAg); 1260403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_vpAg,9L); 126053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+4,(png_uint_32) image->page.width); 126063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) image->page.height); 126073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; /* unit = pixels */ 126083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 126093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 126103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126128fe9159929faad07fb14f2bb0fac9c14d0fd4e20glennrp if (transparent != 0) 126133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_alpha_compression_method==0) 126153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12616bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 126173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 126183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12619fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy size_t 126203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len; 126213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IDAT chunk header */ 126233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12625e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write IDAT chunks from blob, length=%.20g.",(double) 12626f2faecf9facdbbb14fcba373365f9f691a9658e0cristy length); 126273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Copy IDAT chunks */ 126293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy len=0; 126303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p=blob+8; 12631bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=8; i<(ssize_t) length; i+=len+12) 126323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 12633931319b135549a7266ccb46482af6e3ea9468747Cristy len=(size_t) (*p) << 24; 12634931319b135549a7266ccb46482af6e3ea9468747Cristy len|=(size_t) (*(p+1)) << 16; 12635931319b135549a7266ccb46482af6e3ea9468747Cristy len|=(size_t) (*(p+2)) << 8; 12636931319b135549a7266ccb46482af6e3ea9468747Cristy len|=(size_t) (*(p+3)); 126373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=4; 126380fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (*(p)==73 && *(p+1)==68 && *(p+2)==65 && *(p+3)==84) /* IDAT */ 126403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Found an IDAT chunk. */ 12642fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlobMSBULong(image,len); 12643fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy LogPNGChunk(logging,mng_IDAT,len); 12644fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlob(image,len+4,p); 12645fa6de8c321ddfb1c035dcb0901b917b67461dbefcristy (void) WriteBlobMSBULong(image, crc32(0,p,(uInt) len+4)); 126463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 126483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 126493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12652e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Skipping %c%c%c%c chunk, length=%.20g.", 12653e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy *(p),*(p+1),*(p+2),*(p+3),(double) len); 126543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy p+=(8+len); 126563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126587e99a06aa771c9e270e7940731dbf9f2ab2c09b1glennrp else if (length != 0) 126593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 126603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAA chunk header */ 126613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12663e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAA chunk, length=%.20g.",(double) length); 12664bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 126653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAA); 1266603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAA,length); 126673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) data */ 126683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 126693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 126703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob, 126713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) length)); 126723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 126743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 126753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Encode image as a JPEG blob */ 126773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 126793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image_info."); 126803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=(ImageInfo *) CloneImageInfo(image_info); 126813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image_info == (ImageInfo *) NULL) 126823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 126833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 126853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 126863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating jpeg_image."); 126873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1268816ea139d53d867211d3bb0fa859a83de653f687ecristy jpeg_image=CloneImage(image,0,0,MagickTrue,exception); 126893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jpeg_image == (Image *) NULL) 126903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 12691151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 126923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) AcquireUniqueFilename(jpeg_image->filename); 12694151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) FormatLocaleString(jpeg_image_info->filename,MagickPathExtent,"%s", 126953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image->filename); 126963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 126973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=OpenBlob(jpeg_image_info,jpeg_image,WriteBinaryBlobMode, 1269816ea139d53d867211d3bb0fa859a83de653f687ecristy exception); 126993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12702e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Created jpeg_image, %.20g x %.20g.",(double) jpeg_image->columns, 12703e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) jpeg_image->rows); 127043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1270544c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp if (status == MagickFalse) 1270644c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 1270744c22978c1f9d4cc6499a3f69de56d83f36080fdglennrp 127083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (jng_color_type == 8 || jng_color_type == 12) 127093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info->type=GrayscaleType; 127100fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1271159575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image_info->quality=jng_quality; 1271259575fa5c228308a41d7f5028390be2083aaaf6dglennrp jpeg_image->quality=jng_quality; 12713151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image_info->magick,"JPEG",MagickPathExtent); 12714151b66dffc9e3c2e8c4f8cdaca37ff987ca0f497cristy (void) CopyMagickString(jpeg_image->magick,"JPEG",MagickPathExtent); 127150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 127183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Creating blob."); 127190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 12720b3f97ae45019a91b30792a6fa42d81a2689a7025cristy blob=(unsigned char *) ImageToBlob(jpeg_image_info,jpeg_image,&length, 12721b3f97ae45019a91b30792a6fa42d81a2689a7025cristy exception); 127220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 127253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12726e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Successfully read jpeg_image into a blob, length=%.20g.", 12727e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy (double) length); 127283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12730e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Write JDAT chunk, length=%.20g.",(double) length); 127313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 127320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write JDAT chunk(s) */ 12734bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 127353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_JDAT); 1273603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_JDAT,length); 127373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 127383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,blob); 127393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(crc32(0,chunk,4),blob,(uInt) length)); 127403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image=DestroyImage(jpeg_image); 127423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) RelinquishUniqueFileResource(jpeg_image_info->filename); 127433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy jpeg_image_info=DestroyImageInfo(jpeg_image_info); 127443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blob=(unsigned char *) RelinquishMagickMemory(blob); 127453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write any JNG-chunk-e profiles */ 12747cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (void) Magick_png_write_chunk_from_profile(image,"JNG-chunk-e",logging); 127483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Write IEND chunk */ 127503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0L); 127513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_IEND); 1275203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_IEND,0); 127533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 127543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 127553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 127573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 127583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " exit WriteOneJNGImage()"); 127590fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 127603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 127613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 127623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 127643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/* 127653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% W r i t e J N G I m a g e % 127703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% % 127733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% WriteJNGImage() writes a JPEG Network Graphics (JNG) image file. 127763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% JNG support written by Glenn Randers-Pehrson, glennrp@image... 127783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% The format of the WriteJNGImage method is: 127803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1278116ea139d53d867211d3bb0fa859a83de653f687ecristy% MagickBooleanType WriteJNGImage(const ImageInfo *image_info, 1278216ea139d53d867211d3bb0fa859a83de653f687ecristy% Image *image,ExceptionInfo *exception) 127833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% A description of each parameter follows: 127853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image_info: the image info. 127873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 127883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% o image: The image. 127893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy% 1279016ea139d53d867211d3bb0fa859a83de653f687ecristy% o exception: return any errors or warnings in this structure. 1279116ea139d53d867211d3bb0fa859a83de653f687ecristy% 127923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 127933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/ 1279416ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteJNGImage(const ImageInfo *image_info,Image *image, 1279516ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 127963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 127973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1279821f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 1279903812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging, 128003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 128013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 128033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 128043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 128073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 12809e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 128103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 12811e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 128123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12813fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteJNGImage()"); 1281416ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 128153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 128163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 128178320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy if ((image->columns > 65535UL) || (image->rows > 65535UL)) 128188320f8b3b9670410e3e1b6f23f6de429d8f2102eCristy ThrowWriterException(ImageError,"WidthOrHeightExceedsLimit"); 128193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 128223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1282473bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 128253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 128263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 128273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 128283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 128293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 128303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 128313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 128323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 128333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\213JNG\r\n\032\n"); 128353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1283616ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,image_info,image,exception); 128373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 128383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 128403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 128413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 128423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteJNGImage()"); 128433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 128443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 128453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 128463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1284716ea139d53d867211d3bb0fa859a83de653f687ecristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image, 1284816ea139d53d867211d3bb0fa859a83de653f687ecristy ExceptionInfo *exception) 128493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 128503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy const char 128513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *option; 128523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 128543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *next_image; 128553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MagickBooleanType 1285721f0e6211a440c0f96134ea25a1bfe7c5f91c29cglennrp have_mng_structure, 128583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status; 128593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 1286003812ae402fb53d548f0e1d7d14720768f803c2dglennrp volatile MagickBooleanType 1286103812ae402fb53d548f0e1d7d14720768f803c2dglennrp logging; 1286203812ae402fb53d548f0e1d7d14720768f803c2dglennrp 128633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfo 128643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *mng_info; 128653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy int 128673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count, 128683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations, 128693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte; 128703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile int 128723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 128733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 128743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte, 128753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 128763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray, 128773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi, 128783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte; 128793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12880bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy register ssize_t 128813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy i; 128823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned char 128843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[800]; 128853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 128863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy volatile unsigned int 128873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng, 128883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng; 128893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12890bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy volatile size_t 128913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene; 128923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12893bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 128943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=0, 128953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay; 128963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 12897d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#if (PNG_LIBPNG_VER < 10200) 128983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->verbose) 128993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library (libpng-%s) is rather old.\n", 129003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 129013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 129023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Open image file. 129053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image_info != (const ImageInfo *) NULL); 12907e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image_info->signature == MagickCoreSignature); 129083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy assert(image != (Image *) NULL); 12909e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy assert(image->signature == MagickCoreSignature); 129103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename); 12911fd05d626fbb7efa0aeff3755d902b5bcdb89b152glennrp logging=LogMagickEvent(CoderEvent,GetMagickModule(),"Enter WriteMNGImage()"); 1291216ea139d53d867211d3bb0fa859a83de653f687ecristy status=OpenBlob(image_info,image,WriteBinaryBlobMode,exception); 129133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 129143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(status); 129153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Allocate a MngInfo structure. 129183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickFalse; 1292073bd4a51b419e914565bdf204bf1540dc4c8ee26cristy mng_info=(MngInfo *) AcquireMagickMemory(sizeof(MngInfo)); 129213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info == (MngInfo *) NULL) 129223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowWriterException(ResourceLimitError,"MemoryAllocationFailed"); 129233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Initialize members of the MngInfo structure. 129253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ResetMagickMemory(mng_info,0,sizeof(MngInfo)); 129273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->image=image; 129283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy have_mng_structure=MagickTrue; 129293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_mng=LocaleCompare(image_info->magick,"MNG") == 0; 129303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 129323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * See if user has requested a specific PNG subformat to be used 129333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * for all of the PNGs in the MNG being written, e.g., 129343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 129353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * convert *.png png8:animation.mng 129363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * 129373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * To do: check -define png:bit_depth and png:color_type as well, 129383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * or perhaps use mng:bit_depth and mng:color_type instead for 129393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy * global settings. 129403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 129413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png8=LocaleCompare(image_info->magick,"PNG8") == 0; 129433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png24=LocaleCompare(image_info->magick,"PNG24") == 0; 129443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_png32=LocaleCompare(image_info->magick,"PNG32") == 0; 129453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickFalse; 129473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 129483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_jng=MagickTrue; 129493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->adjoin=image_info->adjoin && 129513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && write_mng; 129523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 129543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* Log some info about the input */ 129563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Image 129573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *p; 129583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129602dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Checking input image(s)\n" 129612dd1906783a5ece58a6105b4f59239e28b13caddglennrp " Image_info depth: %.20g, Type: %d", 129622dd1906783a5ece58a6105b4f59239e28b13caddglennrp (double) image_info->depth, image_info->type); 129633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 129643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 129653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (p=image; p != (Image *) NULL; p=GetNextImageInList(p)) 129663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 129670fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12969280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp " Scene: %.20g\n, Image depth: %.20g", 12970280283d1a79ab37cd5a59809848acaf2d6f7843aglennrp (double) scene++, (double) p->depth); 129710fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1297217f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (p->alpha_trait != UndefinedPixelTrait) 129733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: True"); 129750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Matte: False"); 129790fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->storage_class == PseudoClass) 129813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: PseudoClass"); 129830fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Storage class: DirectClass"); 129870fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (p->colors) 129893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 12990e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Number of colors: %.20g",(double) p->colors); 129910fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 129933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 129943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Number of colors: unspecified"); 129950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 129963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin == MagickFalse) 129973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 129983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 129993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 130023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 130033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 130043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 130053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 130063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickFalse; 130073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickFalse; 130083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=1; 130093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=1; 130103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 130123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->page != (char *) NULL) 130133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Determine image bounding box. 130163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy SetGeometry(image,&mng_info->page); 130183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) ParseMetaGeometry(image_info->page,&mng_info->page.x, 130193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy &mng_info->page.y,&mng_info->page.width,&mng_info->page.height); 130203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 130223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned int 130243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom; 130253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy unsigned short 130273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red, 130283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green, 130293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue; 130303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 130313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 130323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickTrue; 130333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->page.width || mng_info->page.height) 130343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_geom=MagickFalse; 130353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Check all the scenes. 130373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 130383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy initial_delay=image->delay; 130393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 130403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=image->chromaticity.red_primary.x != 0.0; 130413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickTrue, 130423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickTrue; 130433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickTrue; 130443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickTrue; 130453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count=0; 130463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 130473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 130483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickTrue; 130493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 130503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickFalse; 130513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 130523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy for (next_image=image; next_image != (Image *) NULL; ) 130533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_geom) 130553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 130563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->columns+next_image->page.x) > mng_info->page.width) 130573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.width=next_image->columns+next_image->page.x; 130580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->rows+next_image->page.y) > mng_info->page.height) 130603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page.height=next_image->rows+next_image->page.y; 130613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 130620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->page.x || next_image->page.y) 130643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_defi=MagickTrue; 130650fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1306617f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (next_image->alpha_trait != UndefinedPixelTrait) 130673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_matte=MagickTrue; 130680fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) next_image->dispose >= BackgroundDispose) 1307017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if ((next_image->alpha_trait != UndefinedPixelTrait) || 13071dc2d327c3b86b0567bdcf9b4d04b5e4663864480cristy next_image->page.x || next_image->page.y || 130723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((next_image->columns < mng_info->page.width) && 130733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (next_image->rows < mng_info->page.height))) 130743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 130750fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->iterations) 130773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickTrue; 130780fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay=next_image->delay; 130800fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != initial_delay || final_delay > 1UL* 130823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->ticks_per_second) 130833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=1; 130840fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 130863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 130873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 130883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy check for global palette possibility. 130893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1309017f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (image->alpha_trait != UndefinedPixelTrait) 130913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 130920fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 130933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte == 0) 130943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13095f1d8548abecaf5ca89d453fd9fc0cde77d20672bdirk if (SetImageGray(image,exception) == MagickFalse) 130963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy all_images_are_gray=MagickFalse; 130973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,next_image); 130983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (use_global_plte == 0) 130993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=mng_info->equal_palettes; 131003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=!mng_info->equal_palettes; 131013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 131033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(next_image) != (Image *) NULL) 131043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->background_color.red != 131063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.red || 131073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.green != 131083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.green || 131093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->background_color.blue != 131103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->background_color.blue) 131113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 131120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->gamma != next_image->next->gamma) 131143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 131150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->rendering_intent != 131173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->rendering_intent) 131183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 131190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((next_image->units != next_image->next->units) || 1312116ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.x != next_image->next->resolution.x) || 1312216ea139d53d867211d3bb0fa859a83de653f687ecristy (next_image->resolution.y != next_image->next->resolution.y)) 131233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 131240fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 131263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (next_image->chromaticity.red_primary.x != 131283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.x || 131293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.red_primary.y != 131303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.red_primary.y || 131313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.x != 131323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.x || 131333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.green_primary.y != 131343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.green_primary.y || 131353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.x != 131363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.x || 131373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.blue_primary.y != 131383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.blue_primary.y || 131393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.x != 131403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.x || 131413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->chromaticity.white_point.y != 131423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image->next->chromaticity.white_point.y) 131433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 131443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_count++; 131473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy next_image=GetNextImageInList(next_image); 131483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_count < 2) 131503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_backgrounds=MagickFalse; 131523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_chrms=MagickFalse; 131533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_gammas=MagickFalse; 131543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs=MagickFalse; 131553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_physs=MagickFalse; 131563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy use_global_plte=MagickFalse; 131573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 131583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_local_plte=MagickTrue; 131593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 131603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy need_iterations=MagickFalse; 131613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131620fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram == MagickFalse) 131643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Only certain framing rates 100/n are exactly representable without 131673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy the FRAM chunk but we'll allow some slop in VLC files 131683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay == 0) 131703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_iterations != MagickFalse) 131723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 131733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 131743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy It's probably a GIF with loop; don't run it *too* fast. 131753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 131760261712cdc8fb4765add50146936e3ba2cb9fefaglennrp if (mng_info->adjoin) 13177d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp { 13178d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp final_delay=10; 1317916ea139d53d867211d3bb0fa859a83de653f687ecristy (void) ThrowMagickException(exception,GetMagickModule(), 1318016ea139d53d867211d3bb0fa859a83de653f687ecristy CoderWarning, 13181d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp "input has zero delay between all frames; assuming", 13182d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp " 10 cs `%s'",""); 13183d908de4208e47f6b6ddb7c288b50d8f6d8845bb2glennrp } 131843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 131863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=0; 131873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 131883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay != 0) 13189cf002022280cc4dedb2748ad6f415aac1d44f530glennrp mng_info->ticks_per_second=(png_uint_32) 13190cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (image->ticks_per_second/final_delay); 131913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 50) 131923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=2; 131930fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 75) 131953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->ticks_per_second=1; 131960fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 131973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (final_delay > 125) 131983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; 131990fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi && final_delay > 2 && (final_delay != 4) && 132013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (final_delay != 5) && (final_delay != 10) && (final_delay != 20) && 13202b9d46a1991a7ff58b567caff7ab7461dfe8cb7c7cristy (final_delay != 25) && (final_delay != 50) && 132030bf214346985a874b4fdc1e2631983bfea5155cddirk (final_delay != (size_t) image->ticks_per_second)) 132043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->need_fram=MagickTrue; /* make it exact; cannot be VLC */ 132053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132060fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram != MagickFalse) 13208b9d46a1991a7ff58b567caff7ab7461dfe8cb7c7cristy mng_info->ticks_per_second=image->ticks_per_second; 132093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If pseudocolor, we should also check to see if all the 132113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy palettes are identical and write a global PLTE if they are. 132123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ../glennrp Feb 99. 132133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MNG version 1.0 signature and MHDR chunk. 132163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,(const unsigned char *) "\212MNG\r\n\032\n"); 132183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,28L); /* chunk data length=28 */ 132193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MHDR); 1322003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MHDR,28L); 132214e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+4,(png_uint_32) mng_info->page.width); 132224e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.height); 132233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,mng_info->ticks_per_second); 132243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+16,0L); /* layer count=unknown */ 132253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+20,0L); /* frame count=unknown */ 132263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+24,0L); /* play time=unknown */ 132273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_jng) 132283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 132303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,27L); /* simplicity=LC+JNG */ 132330fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,25L); /* simplicity=VLC+JNG */ 132363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,19L); /* simplicity=LC+JNG, no transparency */ 132420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,17L); /* simplicity=VLC+JNG, no transparency */ 132453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_matte) 132513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,11L); /* simplicity=LC */ 132540fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,9L); /* simplicity=VLC */ 132573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132580fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi || mng_info->need_fram || use_global_plte) 132623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,3L); /* simplicity=LC, no transparency */ 132630fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 132643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 132653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+28,1L); /* simplicity=VLC, no transparency */ 132663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,32,chunk); 132693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,32)); 13270092ec8d083fedaedfb7792995e7ea42164553cffcristy option=GetImageOption(image_info,"mng:need-cacheoff"); 132713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (option != (const char *) NULL) 132723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy size_t 132743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length; 132753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 132763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write "nEED CACHEOFF" to turn playback caching off for streaming MNG. 132783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_nEED); 132803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length=CopyMagickString((char *) chunk+4,"CACHEOFF",20); 13281bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy (void) WriteBlobMSBULong(image,(size_t) length); 1328203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_nEED,(size_t) length); 132833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy length+=4; 132843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,length,chunk); 132853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) length)); 132863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 132873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((GetPreviousImageInList(image) == (Image *) NULL) && 132883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (GetNextImageInList(image) != (Image *) NULL) && 132893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->iterations != 1)) 132903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 132913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 132923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG TERM chunk 132933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 132943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 132953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_TERM); 1329603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_TERM,10L); 132973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=3; /* repeat animation */ 132983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* show last frame when done */ 132993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+6,(png_uint_32) (mng_info->ticks_per_second* 133003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy final_delay/MagickMax(image->ticks_per_second,1))); 133010fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 133033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,PNG_UINT_31_MAX); 133040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) image->iterations); 133070fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 133093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13311e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM delay: %.20g",(double) (mng_info->ticks_per_second* 13312e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy final_delay/MagickMax(image->ticks_per_second,1))); 133130fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->iterations == 0) 133153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13316e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " TERM iterations: %.20g",(double) PNG_UINT_31_MAX); 133170fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 13320e8c25f9b4c9fb72cad6db08eeda58c7c5784014ecristy " Image iterations: %.20g",(double) image->iterations); 133213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 133233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 133243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy To do: check for cHRM+gAMA == sRGB, and write sRGB instead. 133273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((image->colorspace == sRGBColorspace || image->rendering_intent) && 133293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_srgbs) 133303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG sRGB chunk 133333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); 133353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_sRGB); 1333603812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_sRGB,1L); 133370fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->rendering_intent != UndefinedIntent) 13339e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 13340cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 13341e610a071534e448c46460a5aa39ede33bf56b329glennrp (image->rendering_intent)); 133420fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 13344e610a071534e448c46460a5aa39ede33bf56b329glennrp chunk[4]=(unsigned char) 13345cf002022280cc4dedb2748ad6f415aac1d44f530glennrp Magick_RenderingIntent_to_PNG_RenderingIntent( 13346cf002022280cc4dedb2748ad6f415aac1d44f530glennrp (PerceptualIntent)); 133470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 133493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 133503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_srgb=MagickTrue; 133513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133520fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 133533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 133543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->gamma && mng_info->equal_gammas) 133563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG gAMA chunk 133593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,4L); 133613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_gAMA); 1336203812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_gAMA,4L); 1336335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*image->gamma+0.5)); 133643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,8,chunk); 133653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,8)); 133663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_gama=MagickTrue; 133673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_chrms) 133693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PrimaryInfo 133713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary; 133723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 133733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG cHRM chunk 133753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 133763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,32L); 133773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_cHRM); 1337803812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_cHRM,32L); 133793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.white_point; 1338035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) (100000*primary.x+0.5)); 1338135ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) (100000*primary.y+0.5)); 133823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.red_primary; 1338335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+12,(png_uint_32) (100000*primary.x+0.5)); 1338435ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+16,(png_uint_32) (100000*primary.y+0.5)); 133853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.green_primary; 1338635ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+20,(png_uint_32) (100000*primary.x+0.5)); 1338735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+24,(png_uint_32) (100000*primary.y+0.5)); 133883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy primary=image->chromaticity.blue_primary; 1338935ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+28,(png_uint_32) (100000*primary.x+0.5)); 1339035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+32,(png_uint_32) (100000*primary.y+0.5)); 133913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,36,chunk); 133923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,36)); 133933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_chrm=MagickTrue; 133943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 133953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 1339616ea139d53d867211d3bb0fa859a83de653f687ecristy if (image->resolution.x && image->resolution.y && mng_info->equal_physs) 133973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 133983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 133993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG pHYs chunk 134003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 134013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,9L); 134023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_pHYs); 1340303812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_pHYs,9L); 134040fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerInchResolution) 134063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1340735ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1340816ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0/2.54+0.5)); 134090fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1341035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1341116ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0/2.54+0.5)); 134120fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 134143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134150fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 134173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->units == PixelsPerCentimeterResolution) 134193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1342035ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+4,(png_uint_32) 1342116ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.x*100.0+0.5)); 134220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 1342335ef824baa82511126ff0072ae30eee0da9c05a3cristy PNGLong(chunk+8,(png_uint_32) 1342416ea139d53d867211d3bb0fa859a83de653f687ecristy (image->resolution.y*100.0+0.5)); 134250fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=1; 134273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134280fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 134303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1343116ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+4,(png_uint_32) (image->resolution.x+0.5)); 1343216ea139d53d867211d3bb0fa859a83de653f687ecristy PNGLong(chunk+8,(png_uint_32) (image->resolution.y+0.5)); 134333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[12]=0; 134343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,13,chunk); 134373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,13)); 134383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 134403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG BACK chunk and global bKGD chunk, if the image is transparent 134413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy or does not cover the entire frame. 134423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 1344317f11b056210f082a6d0e54ac5d68e6d72fa76b2cristy if (write_mng && ((image->alpha_trait != UndefinedPixelTrait) || 13444dc2d327c3b86b0567bdcf9b4d04b5e4663864480cristy image->page.x > 0 || image->page.y > 0 || (image->page.width && 134453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->page.width+image->page.x < mng_info->page.width)) 134463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy || (image->page.height && (image->page.height+image->page.y 134473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy < mng_info->page.height)))) 134483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 134503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_BACK); 1345103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_BACK,6L); 134523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy red=ScaleQuantumToShort(image->background_color.red); 134533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy green=ScaleQuantumToShort(image->background_color.green); 134543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy blue=ScaleQuantumToShort(image->background_color.blue); 134553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+4,red); 134563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+6,green); 134573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGShort(chunk+8,blue); 134583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 134593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 134603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_backgrounds) 134613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 134623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,6L); 134633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_bKGD); 1346403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_bKGD,6L); 134653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,10,chunk); 134663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,10)); 134673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 134703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#ifdef PNG_WRITE_EMPTY_PLTE_SUPPORTED 134713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((need_local_plte == MagickFalse) && 134723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (image->storage_class == PseudoClass) && 134733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (all_images_are_gray == MagickFalse)) 134743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13475bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 134763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 134773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 134783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 134793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 134803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 134813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 134823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 134833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1348403812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 134850fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13486bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 134873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 1348816ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[4+i*3]=(unsigned char) (ScaleQuantumToChar( 1348916ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].red) & 0xff); 1349016ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[5+i*3]=(unsigned char) (ScaleQuantumToChar( 1349116ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].green) & 0xff); 1349216ea139d53d867211d3bb0fa859a83de653f687ecristy chunk[6+i*3]=(unsigned char) (ScaleQuantumToChar( 1349316ea139d53d867211d3bb0fa859a83de653f687ecristy image->colormap[i].blue) & 0xff); 134943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 134950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 134963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 134973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,(uInt) (data_length+4))); 134983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 134993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 135013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy scene=0; 135033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->delay=0; 135043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 135053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 135063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=MagickFalse; 135073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 135083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy do 135093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->adjoin) 135113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED) || \ 135133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy defined(PNG_MNG_FEATURES_SUPPORTED) 135143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy If we aren't using a global palette for the entire MNG, check to 135163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy see if we can use one for two or more consecutive images. 135173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 135183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_local_plte && use_global_plte && !all_images_are_gray) 135193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->IsPalette) 135213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy When equal_palettes is true, this image has the same palette 135243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy as the previous PseudoClass image 135253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 135263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=mng_info->equal_palettes; 135273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->equal_palettes=PalettesAreEqual(image,image->next); 135283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->equal_palettes && !mng_info->have_write_global_plte) 135293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 135313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write MNG PLTE chunk 135323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 13533bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy size_t 135343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length; 135353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy data_length=3*image->colors; 135373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,data_length); 135383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_PLTE); 1353903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_PLTE,data_length); 135400fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 13541bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy for (i=0; i < (ssize_t) image->colors; i++) 135423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4+i*3]=ScaleQuantumToChar(image->colormap[i].red); 135443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5+i*3]=ScaleQuantumToChar(image->colormap[i].green); 135453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6+i*3]=ScaleQuantumToChar(image->colormap[i].blue); 135463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135470fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 135483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,data_length+4,chunk); 135493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk, 135503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (uInt) (data_length+4))); 135513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickTrue; 135523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 135553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->have_write_global_plte=MagickFalse; 135563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 135583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (need_defi) 135593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 13560bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy ssize_t 135613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x, 135623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y; 135633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (scene) 135653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=mng_info->page.x; 135673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=mng_info->page.y; 135683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 135703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_x=0; 135723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy previous_y=0; 135733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->page=image->page; 135753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((mng_info->page.x != previous_x) || 135763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->page.y != previous_y)) 135773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 135783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,12L); /* data length=12 */ 135793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_DEFI); 1358003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_DEFI,12L); 135813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=0; /* object 0 MSB */ 135823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* object 0 LSB */ 135833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=0; /* visible */ 135843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* abstract */ 135853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+8,(png_uint_32) mng_info->page.x); 135863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+12,(png_uint_32) mng_info->page.y); 135873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,16,chunk); 135883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,16)); 135893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 135923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->write_mng=write_mng; 135943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if ((int) image->dispose >= 3) 135963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->framing_mode=3; 135973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 135983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (mng_info->need_fram && mng_info->adjoin && 135993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((image->delay != mng_info->delay) || 136003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (mng_info->framing_mode != mng_info->old_framing_mode))) 136013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image->delay == mng_info->delay) 136033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 136053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the new framing mode. 136063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 136073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,1L); /* data length=1 */ 136083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1360903812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,1L); 136103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 136113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,5,chunk); 136123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,5)); 136133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 136153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 136173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write a MNG FRAM chunk with the delay. 136183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 136193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,10L); /* data length=10 */ 136203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_FRAM); 1362103812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_FRAM,10L); 136223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[4]=(unsigned char) mng_info->framing_mode; 136233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[5]=0; /* frame name separator (no name) */ 136243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[6]=2; /* flag for changing default delay */ 136253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[7]=0; /* flag for changing frame timeout */ 136263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[8]=0; /* flag for changing frame clipping */ 136273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy chunk[9]=0; /* flag for changing frame sync_id */ 136283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGLong(chunk+10,(png_uint_32) 136293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ((mng_info->ticks_per_second* 136303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image->delay)/MagickMax(image->ticks_per_second,1))); 136313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,14,chunk); 136323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,14)); 136334e5bc84ff8bf274c4d9206d5e6ffd1a5e5d75335cristy mng_info->delay=(png_uint_32) image->delay; 136343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy mng_info->old_framing_mode=mng_info->framing_mode; 136363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(JNG_SUPPORTED) 136393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (image_info->compression == JPEGCompression) 136403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ImageInfo 136423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy *write_info; 136433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 136453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 136463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing JNG object."); 136473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* To do: specify the desired alpha compression method. */ 136483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=CloneImageInfo(image_info); 136493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info->compression=UndefinedCompression; 1365016ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOneJNGImage(mng_info,write_info,image,exception); 136513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy write_info=DestroyImageInfo(write_info); 136523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy else 136543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 136553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 136573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(), 136583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy " Writing PNG object."); 136592f2e514554975d510c88df54de98c6cdc1080f1cglennrp 13660b9cfe27bef51dbbd1f05aef89c767749d7e37864glennrp mng_info->need_blob = MagickFalse; 136618d3d6e584829223ac5f6e6653c3caa38a2562a74glennrp mng_info->ping_preserve_colormap = MagickFalse; 136622f2e514554975d510c88df54de98c6cdc1080f1cglennrp 136632f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* We don't want any ancillary chunks written */ 136642f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_bKGD=MagickTrue; 136652f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_cHRM=MagickTrue; 13666a0ed009a1e9480ac6f3f4520e9ef29d6d37e27dcglennrp mng_info->ping_exclude_date=MagickTrue; 136672f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_EXIF=MagickTrue; 136682f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_gAMA=MagickTrue; 136692f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_iCCP=MagickTrue; 136702f2e514554975d510c88df54de98c6cdc1080f1cglennrp /* mng_info->ping_exclude_iTXt=MagickTrue; */ 136712f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_oFFs=MagickTrue; 136722f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_pHYs=MagickTrue; 136732f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_sRGB=MagickTrue; 136742f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_tEXt=MagickTrue; 13675a1e3b7b4887860a199d00bddbf4b12e0a93ee1e5glennrp mng_info->ping_exclude_tRNS=MagickTrue; 136762f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_vpAg=MagickTrue; 136772f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zCCP=MagickTrue; 136782f2e514554975d510c88df54de98c6cdc1080f1cglennrp mng_info->ping_exclude_zTXt=MagickTrue; 136792f2e514554975d510c88df54de98c6cdc1080f1cglennrp 1368016ea139d53d867211d3bb0fa859a83de653f687ecristy status=WriteOnePNGImage(mng_info,image_info,image,exception); 136813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy 136833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 136843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 136853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 136863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 136873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickFalse); 136883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 136893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CatchImageException(image); 136903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (GetNextImageInList(image) == (Image *) NULL) 136913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 136923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=SyncNextImageInList(image); 136933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy status=SetImageProgress(image,SaveImagesTag,scene++, 136943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy GetImageListLength(image)); 136950fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 136963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (status == MagickFalse) 136973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy break; 136980fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 136993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } while (mng_info->adjoin); 137000fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (write_mng) 137023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy { 137033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy while (GetPreviousImageInList(image) != (Image *) NULL) 137043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image=GetPreviousImageInList(image); 137053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 137063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Write the MEND chunk. 137073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 137083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,0x00000000L); 137093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNGType(chunk,mng_MEND); 1371003812ae402fb53d548f0e1d7d14720768f803c2dglennrp LogPNGChunk(logging,mng_MEND,0L); 137113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlob(image,4,chunk); 137123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) WriteBlobMSBULong(image,crc32(0,chunk,4)); 137133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy } 137143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy /* 137153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy Relinquish resources. 137163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy */ 137173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) CloseBlob(image); 137183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy MngInfoFreeStruct(mng_info,&have_mng_structure); 137190fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy if (logging != MagickFalse) 137213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy (void) LogMagickEvent(CoderEvent,GetMagickModule(),"exit WriteMNGImage()"); 137220fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(MagickTrue); 137243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13725d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#else /* PNG_LIBPNG_VER > 10011 */ 1372639992b4dd9b12ef752d55b8e402c069698851f72glennrp 137273ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WritePNGImage(const ImageInfo *image_info,Image *image) 137283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 137293bd393f9074299ed9f2f3d128e4985118077c2bdglennrp (void) image; 137303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy printf("Your PNG library is too old: You have libpng-%s\n", 137313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy PNG_LIBPNG_VER_STRING); 137320fe50b47f88ea0fc74b8bdb0e552fc7c58e2b5a0glennrp 137333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy ThrowBinaryException(CoderError,"PNG library is too old", 137343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy image_info->filename); 137353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 1373639992b4dd9b12ef752d55b8e402c069698851f72glennrp 137373ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic MagickBooleanType WriteMNGImage(const ImageInfo *image_info,Image *image) 137383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{ 137393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy return(WritePNGImage(image_info,image)); 137403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} 13741d5045b44ae266ec7d6d2fca5e7c8a69a28938ec4glennrp#endif /* PNG_LIBPNG_VER > 10011 */ 137423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif 13743