From 72bac0dd3d8bc03a06efb206a6fbdd618a39ca7e Mon Sep 17 00:00:00 2001 From: Mavridis Philippe Date: Wed, 10 May 2023 19:19:45 +0300 Subject: [PATCH] Chalk: Fix loading of PNG files with iCCP This commit makes some fixes to the way that iCCP profile data is read and loaded, and adds an additional check to ensure that the PNG file does have a profile. It also introduces a shorter libpng version check of the form: `#if PNG_LIBPNG_VER < 10500` This commit fixes issue #20. Signed-off-by: Mavridis Philippe (cherry picked from commit 5d5725effa1a9e1567b9226f49338e8fe00a3107) --- filters/chalk/png/kis_png_converter.cpp | 56 ++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/filters/chalk/png/kis_png_converter.cpp b/filters/chalk/png/kis_png_converter.cpp index 3956b640b..511008b17 100644 --- a/filters/chalk/png/kis_png_converter.cpp +++ b/filters/chalk/png/kis_png_converter.cpp @@ -221,38 +221,38 @@ KisImageBuilder_Result KisPNGConverter::decode(const KURL& uri) return KisImageBuilder_RESULT_UNSUPPORTED_COLORSPACE; } bool hasalpha = (color_type == PNG_COLOR_TYPE_RGB_ALPHA || color_type == PNG_COLOR_TYPE_GRAY_ALPHA); - - // Read image profile - png_charp profile_name, profile_data; -#if PNG_LIBPNG_VER_MAJOR > 1 || ( PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 5 ) - unsigned char* uprofile_data = reinterpret_cast(profile_data); -#endif - int compression_type; - png_uint_32 proflen; - int number_of_passes = 1; + int number_of_passes = 1; if (interlace_type == PNG_INTERLACE_ADAM7) number_of_passes = png_set_interlace_handling(png_ptr); + // Read image profile KisProfile* profile = 0; -#if PNG_LIBPNG_VER_MAJOR > 1 || ( PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 5 ) - if(png_get_iCCP(png_ptr, info_ptr, &profile_name, &compression_type, &uprofile_data, &proflen)) + if (png_get_valid(png_ptr, info_ptr, PNG_INFO_iCCP)) { + png_charp profile_name; +#if PNG_LIBPNG_VER < 10500 + png_charp profile_data; #else - if(png_get_iCCP(png_ptr, info_ptr, &profile_name, &compression_type, &profile_data, &proflen)) + png_bytep profile_data; #endif - { - TQByteArray profile_rawdata; - // XXX: Hardcoded for icc type -- is that correct for us? - if (TQString::compare(profile_name, "icc") == 0) { - profile_rawdata.resize(proflen); - memcpy(profile_rawdata.data(), profile_data, proflen); - profile = new KisProfile(profile_rawdata); - TQ_CHECK_PTR(profile); - if (profile) { - kdDebug(41008) << "profile name: " << profile->productName() << " profile description: " << profile->productDescription() << " information sur le produit: " << profile->productInfo() << endl; - if(!profile->isSuitableForOutput()) - { - kdDebug(41008) << "the profile is not suitable for output and therefore cannot be used in chalk, we need to convert the image to a standard profile" << endl; // TODO: in ko2 popup a selection menu to inform the user + int compression_type; + png_uint_32 proflen; + + if (png_get_iCCP(png_ptr, info_ptr, &profile_name, &compression_type, &profile_data, &proflen)) + { + TQByteArray profile_rawdata; + // XXX: Hardcoded for icc type -- is that correct for us? + if (TQString::compare(profile_name, "icc") == 0) { + profile_rawdata.resize(proflen); + memcpy(profile_rawdata.data(), profile_data, proflen); + profile = new KisProfile(profile_rawdata); + TQ_CHECK_PTR(profile); + if (profile) { + kdDebug(41008) << "profile name: " << profile->productName() << " profile description: " << profile->productDescription() << " information sur le produit: " << profile->productInfo() << endl; + if(!profile->isSuitableForOutput()) + { + kdDebug(41008) << "the profile is not suitable for output and therefore cannot be used in chalk, we need to convert the image to a standard profile" << endl; // TODO: in ko2 popup a selection menu to inform the user + } } } } @@ -636,10 +636,10 @@ KisImageBuilder_Result KisPNGConverter::buildFile(const KURL& uri, KisPaintLayer } else { // Profile char* name = new char[(*it)->type().length()+1]; strcpy(name, (*it)->type().ascii()); -#if PNG_LIBPNG_VER_MAJOR > 1 || ( PNG_LIBPNG_VER_MAJOR == 1 && PNG_LIBPNG_VER_MINOR >= 5 ) - png_set_iCCP(png_ptr, info_ptr, name, PNG_COMPRESSION_TYPE_BASE, (unsigned char*)(*it)->annotation().data(), (*it) -> annotation() . size()); +#if PNG_LIBPNG_VER < 10500 + png_set_iCCP(png_ptr, info_ptr, name, PNG_COMPRESSION_TYPE_BASE, (png_charp)(*it)->annotation().data(), (*it) -> annotation() . size()); #else - png_set_iCCP(png_ptr, info_ptr, name, PNG_COMPRESSION_TYPE_BASE, (char*)(*it)->annotation().data(), (*it) -> annotation() . size()); + png_set_iCCP(png_ptr, info_ptr, name, PNG_COMPRESSION_TYPE_BASE, (png_bytep)(*it)->annotation().data(), (*it) -> annotation() . size()); #endif } ++it;