From dfc82c403c382e0ec95949edb91beb5946cf11b2 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 21 Sep 2021 22:19:27 -0700 Subject: [PATCH 01/25] Add ability to import JXL images --- CMakeLists.txt | 5 ++ rtdata/options/options.lin | 4 +- rtdata/options/options.osx | 4 +- rtdata/options/options.win | 4 +- rtengine/CMakeLists.txt | 1 + rtengine/imageio.cc | 168 ++++++++++++++++++++++++++++++++++++- rtengine/imageio.h | 4 + rtengine/stdimagesource.cc | 6 ++ rtengine/utils.cc | 8 ++ rtengine/utils.h | 5 ++ rtgui/main-cli.cc | 2 +- rtgui/thumbnail.cc | 15 ++++ 12 files changed, 218 insertions(+), 8 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 051d215e2..5ed90ca61 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -552,6 +552,11 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() +pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) +if(JXL) + set(JXL_LIBRARIES jxl jxl_threads) +endif() + # Check for libcanberra-gtk3 (sound events on Linux): if(UNIX AND (NOT APPLE)) option(USE_LIBCANBERRA "Build with libcanberra" ON) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index fbd8bc6cb..0f31df6ee 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index ef68d7144..273b189e5 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 00b74d07f..9f72a1a72 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index 6f329f7be..b92917ef5 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -246,6 +246,7 @@ target_link_libraries(rtengine ${RSVG_LIBRARIES} ${KLT_LIBRARIES} ${EXIV2_LIBRARIES} + ${JXL_LIBRARIES} ) if(OpenMP_FOUND) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e2c6c1310..ece182821 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -24,13 +24,20 @@ #include #include #include - #include #include #include #include #include +#ifdef JXL +#include +#include "jxl/decode.h" +#include "jxl/decode_cxx.h" +#include "jxl/resizable_parallel_runner.h" +#include "jxl/resizable_parallel_runner_cxx.h" +#endif + #ifdef _WIN32 #include #else @@ -822,6 +829,161 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) return IMIO_SUCCESS; } +#ifdef JXL +#define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL + +// adapted from libjxl +int ImageIO::loadJxl(const Glib::ustring &fname) +{ + if (pl) { + pl->setProgressStr("PROGRESSBAR_LOADJXL"); + pl->setProgress(0.0); + } + + std::vector icc_profile; + + gpointer buffer = nullptr; + size_t buffer_size = 0; + + JxlBasicInfo info = {}; + JxlPixelFormat format = {}; + + format.num_channels = 3; + format.data_type = JXL_TYPE_FLOAT; + format.endianness = JXL_NATIVE_ENDIAN; + format.align = 0; + + // get file contents + std::ifstream instream(fname.c_str(), std::ios::in | std::ios::binary); + std::vector compressed( + (std::istreambuf_iterator(instream)), + std::istreambuf_iterator()); + instream.close(); + + + // multi-threaded parallel runner. + auto runner = JxlResizableParallelRunnerMake(nullptr); + + auto dec = JxlDecoderMake(nullptr); + if (JXL_DEC_SUCCESS != + JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | + JXL_DEC_COLOR_ENCODING | + JXL_DEC_FULL_IMAGE)) { + g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); + return false; + } + + if (JXL_DEC_SUCCESS != + JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, + runner.get())) { + g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); + return false; + } + + // grand decode loop... + JxlDecoderSetInput(dec.get(), compressed.data(), compressed.size()); + + while (true) { + JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); + + if (status == JXL_DEC_BASIC_INFO) { + if (JXL_DEC_SUCCESS != + JxlDecoderGetBasicInfo(dec.get(), &info)) { + g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); + return false; + } + + JxlResizableParallelRunnerSetThreads( + runner.get(), JxlResizableParallelRunnerSuggestThreads( + info.xsize, info.ysize)); + } else if (status == JXL_DEC_COLOR_ENCODING) { + // check for ICC profile + deleteLoadedProfileData(); + embProfile = nullptr; + size_t icc_size = 0; + + if (JXL_DEC_SUCCESS != + JxlDecoderGetICCProfileSize(dec.get(), &format, + _PROFILE_, &icc_size)) { + g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); + } + + if (icc_size > 0) { + icc_profile.resize(icc_size); + if (JXL_DEC_SUCCESS != + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size())) { + g_printerr( + "Warning: JxlDecoderGetColorAsICCProfile failed\n"); + } else { + embProfile = cmsOpenProfileFromMem(icc_profile.data(), + icc_profile.size()); + } + } else { + g_printerr("Warning: Empty ICC data.\n"); + } + } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { + format.data_type = JXL_TYPE_FLOAT; + if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( + dec.get(), &format, &buffer_size)) { + g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); + return false; + } + buffer = g_malloc(buffer_size); + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, + buffer, buffer_size)) { + g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); + g_free(buffer); + return false; + } + } else if (status == JXL_DEC_FULL_IMAGE || + status == JXL_DEC_FRAME) { + // Nothing to do. If the image is an animation, more full frames + // may be decoded. This example only keeps the first one. + } else if (status == JXL_DEC_SUCCESS) { + // All decoding successfully finished. + // It's not required to call JxlDecoderReleaseInput(dec.get()) + // since the decoder will be destroyed. + break; + } else if (status == JXL_DEC_NEED_MORE_INPUT) { + g_printerr("Error: Already provided all input\n"); + return false; + } else if (status == JXL_DEC_ERROR) { + g_printerr("Error: Decoder error\n"); + return false; + } else { + g_printerr("Error: Unknown decoder status\n"); + return false; + } + } // end grand decode loop + + unsigned int width = info.xsize; + unsigned int height = info.ysize; + + allocate(width, height); + + int line_length = width * 3 * 4; + + for (size_t row = 0; row < height; ++row) { + setScanline (row, ((const unsigned char*)buffer) + (row * line_length), 32); + + if (pl && !(row % 100)) { + pl->setProgress ((double)(row) / height); + } + } + + g_free(buffer); + + if (pl) { + pl->setProgressStr ("PROGRESSBAR_READY"); + pl->setProgress (1.0); + } + + return IMIO_SUCCESS; +} +#endif + int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps) { allocate (width, height); @@ -1310,6 +1472,10 @@ int ImageIO::load (const Glib::ustring &fname) return loadPNG (fname); } else if (hasJpegExtension(fname)) { return loadJPEG (fname); +#ifdef JXL + } else if (hasJxlExtension(fname)) { + return loadJxl(fname); +#endif } else if (hasTiffExtension(fname)) { return loadTIFF (fname); } else { diff --git a/rtengine/imageio.h b/rtengine/imageio.h index 813bfcc61..e7fa23b20 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -90,6 +90,10 @@ public: int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; +#ifdef JXL + int loadJxl (const Glib::ustring &fname); +#endif + int loadPNG (const Glib::ustring &fname); int loadJPEG (const Glib::ustring &fname); int loadTIFF (const Glib::ustring &fname); diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 435f2f9a0..33d02e5b1 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -90,6 +90,12 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma if (result == IMIO_SUCCESS) { return; } +#ifdef JXL + } else if (hasJxlExtension(fname)) { + sFormat = IIOSF_FLOAT32; + sArrangement = IIOSA_CHUNKY; + return; +#endif } else if (hasTiffExtension(fname)) { int result = ImageIO::getTIFFSampleFormat (fname, sFormat, sArrangement); diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 0674c9806..0a53f0a83 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -237,6 +237,14 @@ bool hasJpegExtension(const Glib::ustring& filename) return extension == "jpg" || extension == "jpeg"; } +#ifdef JXL +bool hasJxlExtension(const Glib::ustring& filename) +{ + const Glib::ustring extension = getFileExtension(filename); + return extension == "jxl"; +} +#endif + bool hasTiffExtension(const Glib::ustring& filename) { const Glib::ustring extension = getFileExtension(filename); diff --git a/rtengine/utils.h b/rtengine/utils.h index e0097d76e..06f42237c 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -52,6 +52,11 @@ bool hasTiffExtension(const Glib::ustring& filename); // Return true if file has .png extension (ignoring case) bool hasPngExtension(const Glib::ustring& filename); +#ifdef JXL +// Return true if file has .jxl extension (ignoring case) +bool hasJxlExtension(const Glib::ustring& filename); +#endif + void swab(const void* from, void* to, ssize_t n); } diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 6d63d194a..6a3c34694 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -707,7 +707,7 @@ int processLineParams ( int argc, char **argv ) isRaw = true; Glib::ustring ext = getExtension (inputFile); - if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png") { + if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png" || ext.lowercase() == "jxl") { isRaw = false; } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 266dbacd3..a0164bc7d 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -212,6 +212,12 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { cfs.format = FT_Jpeg; } + } else if (ext == "jxl") { + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); + + if (tpp) { + cfs.format = FT_Png; + } } else if (ext == "png") { tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); @@ -255,6 +261,15 @@ void Thumbnail::_generateThumbnailImage () } } + if (!tpp) { + // try a custom loader + tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, true); + if (tpp) { + cfs.format = FT_Custom; + infoFromImage(fname); + } + } + if (tpp) { tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); _saveThumbnail (); From dd01cc110bc438507a22bc86c4728319caebc11b Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 23 Sep 2021 13:34:48 -0700 Subject: [PATCH 02/25] Add error code to returns Fix conditional libjxl compilation --- CMakeLists.txt | 4 ++-- rtengine/CMakeLists.txt | 3 +++ rtengine/imageio.cc | 26 +++++++++++++------------- rtengine/imageio.h | 2 +- rtengine/stdimagesource.cc | 2 +- rtengine/utils.cc | 2 +- rtengine/utils.h | 2 +- rtgui/main-cli.cc | 2 +- rtgui/thumbnail.cc | 14 ++++++++------ 9 files changed, 31 insertions(+), 26 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 5ed90ca61..23a3dbc0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -553,8 +553,8 @@ if(WITH_SYSTEM_KLT) endif() pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) -if(JXL) - set(JXL_LIBRARIES jxl jxl_threads) +if(JXL_FOUND) + add_definitions(-DLIBJXL) endif() # Check for libcanberra-gtk3 (sound events on Linux): diff --git a/rtengine/CMakeLists.txt b/rtengine/CMakeLists.txt index b92917ef5..5d87310b9 100644 --- a/rtengine/CMakeLists.txt +++ b/rtengine/CMakeLists.txt @@ -45,6 +45,9 @@ endif() if(EXIV2_INCLUDE_DIRS) include_directories("${EXIV2_INCLUDE_DIRS}") endif() +if(JXL_INCLUDE_DIRS) + include_directories("${JXL_INCLUDE_DIRS}") +endif() link_directories( "${EXPAT_LIBRARY_DIRS}" diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index ece182821..675e75f65 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -30,7 +30,7 @@ #include #include -#ifdef JXL +#ifdef LIBJXL #include #include "jxl/decode.h" #include "jxl/decode_cxx.h" @@ -829,9 +829,8 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) return IMIO_SUCCESS; } -#ifdef JXL +#ifdef LIBJXL #define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL - // adapted from libjxl int ImageIO::loadJxl(const Glib::ustring &fname) { @@ -870,14 +869,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE)) { g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); - return false; + return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, runner.get())) { g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); - return false; + return IMIO_HEADERERROR; } // grand decode loop... @@ -890,7 +889,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); - return false; + return IMIO_HEADERERROR; } JxlResizableParallelRunnerSetThreads( @@ -928,14 +927,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( dec.get(), &format, &buffer_size)) { g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); - return false; + return IMIO_READERROR; } buffer = g_malloc(buffer_size); if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); g_free(buffer); - return false; + return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || status == JXL_DEC_FRAME) { @@ -948,13 +947,13 @@ int ImageIO::loadJxl(const Glib::ustring &fname) break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { g_printerr("Error: Already provided all input\n"); - return false; + return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { g_printerr("Error: Decoder error\n"); - return false; + return IMIO_READERROR; } else { g_printerr("Error: Unknown decoder status\n"); - return false; + return IMIO_READERROR; } } // end grand decode loop @@ -982,7 +981,8 @@ int ImageIO::loadJxl(const Glib::ustring &fname) return IMIO_SUCCESS; } -#endif +#undef _PROFILE_ +#endif // LIBJXL int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps) { @@ -1472,7 +1472,7 @@ int ImageIO::load (const Glib::ustring &fname) return loadPNG (fname); } else if (hasJpegExtension(fname)) { return loadJPEG (fname); -#ifdef JXL +#ifdef LIBJXL } else if (hasJxlExtension(fname)) { return loadJxl(fname); #endif diff --git a/rtengine/imageio.h b/rtengine/imageio.h index e7fa23b20..cfc54e629 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -90,7 +90,7 @@ public: int load (const Glib::ustring &fname); int save (const Glib::ustring &fname) const; -#ifdef JXL +#ifdef LIBJXL int loadJxl (const Glib::ustring &fname); #endif diff --git a/rtengine/stdimagesource.cc b/rtengine/stdimagesource.cc index 33d02e5b1..32961f975 100644 --- a/rtengine/stdimagesource.cc +++ b/rtengine/stdimagesource.cc @@ -90,7 +90,7 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma if (result == IMIO_SUCCESS) { return; } -#ifdef JXL +#ifdef LIBJXL } else if (hasJxlExtension(fname)) { sFormat = IIOSF_FLOAT32; sArrangement = IIOSA_CHUNKY; diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 0a53f0a83..4c4f18691 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -237,7 +237,7 @@ bool hasJpegExtension(const Glib::ustring& filename) return extension == "jpg" || extension == "jpeg"; } -#ifdef JXL +#ifdef LIBJXL bool hasJxlExtension(const Glib::ustring& filename) { const Glib::ustring extension = getFileExtension(filename); diff --git a/rtengine/utils.h b/rtengine/utils.h index 06f42237c..7ff16c79b 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -52,7 +52,7 @@ bool hasTiffExtension(const Glib::ustring& filename); // Return true if file has .png extension (ignoring case) bool hasPngExtension(const Glib::ustring& filename); -#ifdef JXL +#ifdef LIBJXL // Return true if file has .jxl extension (ignoring case) bool hasJxlExtension(const Glib::ustring& filename); #endif diff --git a/rtgui/main-cli.cc b/rtgui/main-cli.cc index 6a3c34694..6d63d194a 100644 --- a/rtgui/main-cli.cc +++ b/rtgui/main-cli.cc @@ -707,7 +707,7 @@ int processLineParams ( int argc, char **argv ) isRaw = true; Glib::ustring ext = getExtension (inputFile); - if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png" || ext.lowercase() == "jxl") { + if (ext.lowercase() == "jpg" || ext.lowercase() == "jpeg" || ext.lowercase() == "tif" || ext.lowercase() == "tiff" || ext.lowercase() == "png") { isRaw = false; } diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index a0164bc7d..ba4c223ca 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -212,18 +212,20 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { cfs.format = FT_Jpeg; } - } else if (ext == "jxl") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); - - if (tpp) { - cfs.format = FT_Png; - } } else if (ext == "png") { tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { cfs.format = FT_Png; } +#ifdef LIBJXL + } else if (ext == "jxl") { + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); + + if (tpp) { + cfs.format = FT_Custom; + } +#endif } else if (ext == "tif" || ext == "tiff") { infoFromImage (fname); tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); From 320859bf922baa359203c34b921e65867a687fcf Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 23 Sep 2021 14:02:54 -0700 Subject: [PATCH 03/25] Remove unnecessary thumbnail loading code --- rtgui/thumbnail.cc | 83 +++++++++++++++------------------------------- 1 file changed, 26 insertions(+), 57 deletions(-) diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index ba4c223ca..18829d9e1 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -184,7 +184,6 @@ Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath) void Thumbnail::_generateThumbnailImage () { - // delete everything loaded into memory delete tpp; tpp = nullptr; @@ -205,67 +204,37 @@ void Thumbnail::_generateThumbnailImage () cfs.exifValid = false; cfs.timeValid = false; - if (ext == "jpg" || ext == "jpeg") { + // RAW works like this: + // 1. if we are here it's because we aren't in the cache so load the JPG + // image out of the RAW. Mark as "quick". + // 2. if we don't find that then just grab the real image. + bool quick = false; + + rtengine::eSensorType sensorType = rtengine::ST_NONE; + if ( initial_ && options.internalThumbIfUntouched) { + quick = true; + tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); + } + + if ( tpp == nullptr ) { + quick = false; + tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + } + + cfs.sensortype = sensorType; + if (tpp) { + cfs.format = FT_Raw; + cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Jpeg; - } - } else if (ext == "png") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Png; - } -#ifdef LIBJXL - } else if (ext == "jxl") { - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal); - - if (tpp) { - cfs.format = FT_Custom; - } -#endif - } else if (ext == "tif" || ext == "tiff") { - infoFromImage (fname); - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); - - if (tpp) { - cfs.format = FT_Tiff; - } - } else { - // RAW works like this: - // 1. if we are here it's because we aren't in the cache so load the JPG - // image out of the RAW. Mark as "quick". - // 2. if we don't find that then just grab the real image. - bool quick = false; - - rtengine::eSensorType sensorType = rtengine::ST_NONE; - if ( initial_ && options.internalThumbIfUntouched) { - quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); - } - - if ( tpp == nullptr ) { - quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); - } - - cfs.sensortype = sensorType; - if (tpp) { - cfs.format = FT_Raw; - cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname); - if (!quick) { - cfs.width = tpp->full_width; - cfs.height = tpp->full_height; - } + if (!quick) { + cfs.width = tpp->full_width; + cfs.height = tpp->full_height; } } if (!tpp) { - // try a custom loader - tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, true); + // this will load formats supported by imagio (jpg, png, jxl, and tiff) + tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); if (tpp) { cfs.format = FT_Custom; infoFromImage(fname); From 135bb7d2e9b38ec4fec3575053cdb99bb5b64cbd Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 23 Oct 2021 17:17:16 -0700 Subject: [PATCH 04/25] alphabetize extensions in rtdata/options/options.* --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index 0f31df6ee..c30ff61c7 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index 273b189e5..aec627ae8 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index 9f72a1a72..a583b9046 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f;jxl; -ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1;1; +ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f +ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 [Output] PathTemplate=%p1/converted/%f From 8c4ab0277ab9d6091fcc436bff7dca820af5c2fe Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 23 Oct 2021 17:19:16 -0700 Subject: [PATCH 05/25] change , to ; in rtdata/options/options.* --- rtdata/options/options.lin | 4 ++-- rtdata/options/options.osx | 4 ++-- rtdata/options/options.win | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/rtdata/options/options.lin b/rtdata/options/options.lin index c30ff61c7..2a96c6997 100644 --- a/rtdata/options/options.lin +++ b/rtdata/options/options.lin @@ -12,8 +12,8 @@ MultiUser=true [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.osx b/rtdata/options/options.osx index aec627ae8..eff9cd8d9 100644 --- a/rtdata/options/options.osx +++ b/rtdata/options/options.osx @@ -13,8 +13,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f diff --git a/rtdata/options/options.win b/rtdata/options/options.win index a583b9046..e3f43343e 100644 --- a/rtdata/options/options.win +++ b/rtdata/options/options.win @@ -14,8 +14,8 @@ UseSystemTheme=false [File Browser] # Image filename extensions to be looked for, and their corresponding search state (0/1 -> skip/include) -ParseExtensions=3fr,arw,arq,cr2,cr3,crf,crw,dcr,dng,fff,iiq,jpg,jpeg,jxl,kdc,mef,mos,mrw,nef,nrw,orf,ori,pef,png,raf,raw,rw2,rwl,rwz,sr2,srf,srw,tif,tiff,x3f -ParseExtensionsEnabled=1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,1,1,1,1,1,1,1,1,1,1,1 +ParseExtensions=3fr;arw;arq;cr2;cr3;crf;crw;dcr;dng;fff;iiq;jpg;jpeg;jxl;kdc;mef;mos;mrw;nef;nrw;orf;ori;pef;png;raf;raw;rw2;rwl;rwz;sr2;srf;srw;tif;tiff;x3f; +ParseExtensionsEnabled=1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;1;0;1;0;1;1;1;1;1;1;1;1;1;1;1; [Output] PathTemplate=%p1/converted/%f From 7715d156159abc10d7fbb43a75f63cacc31b12a4 Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 12:32:49 +0000 Subject: [PATCH 06/25] Update to current libjxl API --- rtengine/imageio.cc | 22 ++++++++++------------ 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 675e75f65..e5a3683dc 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -859,7 +859,6 @@ int ImageIO::loadJxl(const Glib::ustring &fname) std::istreambuf_iterator()); instream.close(); - // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); @@ -886,15 +885,14 @@ int ImageIO::loadJxl(const Glib::ustring &fname) JxlDecoderStatus status = JxlDecoderProcessInput(dec.get()); if (status == JXL_DEC_BASIC_INFO) { - if (JXL_DEC_SUCCESS != - JxlDecoderGetBasicInfo(dec.get(), &info)) { + if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); return IMIO_HEADERERROR; } JxlResizableParallelRunnerSetThreads( - runner.get(), JxlResizableParallelRunnerSuggestThreads( - info.xsize, info.ysize)); + runner.get(), + JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize)); } else if (status == JXL_DEC_COLOR_ENCODING) { // check for ICC profile deleteLoadedProfileData(); @@ -902,8 +900,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) size_t icc_size = 0; if (JXL_DEC_SUCCESS != - JxlDecoderGetICCProfileSize(dec.get(), &format, - _PROFILE_, &icc_size)) { + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size)) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } @@ -911,7 +908,7 @@ int ImageIO::loadJxl(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != JxlDecoderGetColorAsICCProfile( - dec.get(), &format, _PROFILE_, + dec.get(), _PROFILE_, icc_profile.data(), icc_profile.size())) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); @@ -924,14 +921,15 @@ int ImageIO::loadJxl(const Glib::ustring &fname) } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { format.data_type = JXL_TYPE_FLOAT; - if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize( - dec.get(), &format, &buffer_size)) { + + if (JXL_DEC_SUCCESS != + JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); return IMIO_READERROR; } + buffer = g_malloc(buffer_size); - if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, - buffer, buffer_size)) { + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); g_free(buffer); return IMIO_READERROR; From b2550abd83f598030a7dc3dc49f0e321658c9aa8 Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 13:44:09 +0000 Subject: [PATCH 07/25] Add cmake option WITH_JXL ON = Force required OFF = Optional --- CMakeLists.txt | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 23a3dbc0c..f26112cd2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,6 +222,7 @@ option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) +option(WITH_JXL "Build with JPEG XL import support" OFF) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) @@ -552,7 +553,12 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() -pkg_check_modules(JXL IMPORTED_TARGET libjxl libjxl_threads) +set(JXL_LIBS "libjxl libjxl_threads") +if(WITH_JXL) + pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) +else() + pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) +endif() if(JXL_FOUND) add_definitions(-DLIBJXL) endif() From 4a16bdd624ffbce579359a9acc425c6efec4949d Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 18:18:55 +0000 Subject: [PATCH 08/25] Change WITH_JXL option to tristate (AUTO/ON/OFF) --- CMakeLists.txt | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f26112cd2..4fd1221c0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -222,7 +222,6 @@ option(USE_EXPERIMENTAL_LANG_VERSIONS "Build with -std=c++0x" OFF) option(BUILD_SHARED "Build with shared libraries" OFF) option(WITH_BENCHMARK "Build with benchmark code" OFF) option(WITH_MYFILE_MMAP "Build using memory mapped file" ON) -option(WITH_JXL "Build with JPEG XL import support" OFF) option(WITH_LTO "Build with link-time optimizations" OFF) option(WITH_SAN "Build with run-time sanitizer" OFF) option(WITH_PROF "Build with profiling instrumentation" OFF) @@ -248,6 +247,9 @@ set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") +set(WITH_JXL AUTO CACHE STRING "Build with JPEG XL support") +set_property(CACHE WITH_JXL PROPERTY STRINGS AUTO ON OFF) + # Set installation directories: if(WIN32 OR APPLE) if(BUILD_BUNDLE) @@ -560,7 +562,13 @@ else() pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) endif() if(JXL_FOUND) - add_definitions(-DLIBJXL) + if(WITH_JXL OR WITH_JXL STREQUAL AUTO) + add_definitions(-DLIBJXL) + else() + message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") + set(JXL_INCLUDE_DIRS "") + set(JXL_LIBRARIES "") + endif() endif() # Check for libcanberra-gtk3 (sound events on Linux): From c514fbb939662aa0df0e5015f9a7560f1c97aeee Mon Sep 17 00:00:00 2001 From: xiota Date: Wed, 10 Apr 2024 18:51:06 +0000 Subject: [PATCH 09/25] Fix tristate auto behavior --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4fd1221c0..141783f23 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -247,7 +247,7 @@ set(TCMALLOC_LIB_DIR "" CACHE PATH "Custom path for the tcmalloc library") -set(WITH_JXL AUTO CACHE STRING "Build with JPEG XL support") +set(WITH_JXL "AUTO" CACHE STRING "Build with JPEG XL support") set_property(CACHE WITH_JXL PROPERTY STRINGS AUTO ON OFF) # Set installation directories: @@ -556,13 +556,13 @@ if(WITH_SYSTEM_KLT) endif() set(JXL_LIBS "libjxl libjxl_threads") -if(WITH_JXL) +if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) else() pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) endif() if(JXL_FOUND) - if(WITH_JXL OR WITH_JXL STREQUAL AUTO) + if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") From 01f925d8d7f295be0efcdb6f744a1e57a0fdb4d9 Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 11 Apr 2024 05:31:03 +0000 Subject: [PATCH 10/25] Revise cmake tristate option --- CMakeLists.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 141783f23..fe7884ee9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -555,12 +555,12 @@ if(WITH_SYSTEM_KLT) find_package(KLT REQUIRED) endif() -set(JXL_LIBS "libjxl libjxl_threads") if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") - pkg_check_modules(JXL REQUIRED IMPORTED_TARGET ${JXL_LIBS}) + set(JXL_REQUIRED "REQUIRED") else() - pkg_check_modules(JXL IMPORTED_TARGET ${JXL_LIBS}) + set(JXL_REQUIRED "") endif() +pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl libjxl_threads) if(JXL_FOUND) if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) From fe68e913be19fe5b8ae8af9bf8c0defaf4fdba4e Mon Sep 17 00:00:00 2001 From: xiota Date: Thu, 11 Apr 2024 15:44:55 +0000 Subject: [PATCH 11/25] Conditional compilation for old/new API Debian/Ubuntu package libjxl 0.7.0, but Arch/MSYS2 package 0.10.2 --- rtengine/imageio.cc | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index e5a3683dc..c6576b3c8 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -900,16 +900,28 @@ int ImageIO::loadJxl(const Glib::ustring &fname) size_t icc_size = 0; if (JXL_DEC_SUCCESS != - JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size)) { +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) + JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) +#else + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) +#endif + ) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } if (icc_size > 0) { icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size()) +#else JxlDecoderGetColorAsICCProfile( dec.get(), _PROFILE_, - icc_profile.data(), icc_profile.size())) { + icc_profile.data(), icc_profile.size()) +#endif + ) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); } else { From 79450113b4cff12af787e209b1fbbd9b57d3a6ec Mon Sep 17 00:00:00 2001 From: xiota Date: Fri, 12 Apr 2024 22:02:37 +0000 Subject: [PATCH 12/25] Add libjxl to workflow depends lists --- .github/workflows/appimage.yml | 2 +- .github/workflows/codeql.yml | 2 +- .github/workflows/macos.yml | 2 +- .github/workflows/windows.yml | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index cf82dafb8..b44ce89c6 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,7 +35,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libjxl-dev libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full - name: Install Exiv2 run: | diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index f57786098..868bccf42 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libjxl-dev - name: Configure build run: | diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 8755f7c66..ad16f96d5 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -25,7 +25,7 @@ jobs: mkdir build date +%s > build/stamp brew uninstall --ignore-dependencies libtiff - brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 | tee -a depslog + brew install libtiff gtk+3 gtkmm3 gtk-mac-integration adwaita-icon-theme libsigc++@2 little-cms2 libiptcdata fftw lensfun expat pkgconfig llvm shared-mime-info exiv2 jpeg-xl | tee -a depslog date -u echo "----====Pourage====----" cat depslog | grep Pouring diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 6963df7c9..56a6320e6 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -52,6 +52,7 @@ jobs: fftw:p lensfun:p libiptcdata:p + libjxl:p exiv2:p - name: Configure build From 9cd5ebbf3795711fd52fc0eb321b413ec5099a9f Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 02:08:02 +0000 Subject: [PATCH 13/25] Add libjxl to appimage workflow --- .github/workflows/appimage.yml | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index b44ce89c6..cc0f6b025 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,7 +35,21 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libjxl-dev libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full libtcmalloc-minimal4 + + - name: Install libjxl + run: | + echo "Downloading and installing libhwy and libjxl..." + VERSION_UBUNTU=20.04 + VERSION_JXL=0.10.2 + DEB_URL_HWYDEV="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy-dev_0.16.0-0focal1_amd64.deb" + DEB_URL_HWY="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy0_0.16.0-0focal1_amd64.deb" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy-dev.deb "$DEB_URL_HWYDEV" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy.deb "$DEB_URL_HWY" + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ + "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" + tar xf libjxl-debs.tar.gz + DEBIAN_FRONTEND=noninteractive sudo dpkg -i libhwy-dev.deb libhwy.deb jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb - name: Install Exiv2 run: | From aff8de59ea1efcadb7bbcdaad120e4215508a2f0 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 02:10:17 +0000 Subject: [PATCH 14/25] Add libjxl to codeql workflow --- .github/workflows/codeql.yml | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 868bccf42..9452c0587 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,17 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libjxl-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libhwy0 libhwy-dev + + - name: Install libjxl + run: | + echo "Downloading and installing libjxl..." + VERSION_UBUNTU=22.04 + VERSION_JXL=0.10.2 + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ + "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" + tar xf libjxl-debs.tar.gz + DEBIAN_FRONTEND=noninteractive sudo dpkg -i jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb - name: Configure build run: | From 775f7cbd036c394dcce2aff926460739d6d4245c Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 05:22:24 +0000 Subject: [PATCH 15/25] Add missing dep to codeql workflow --- .github/workflows/codeql.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml index 9452c0587..049b1d184 100644 --- a/.github/workflows/codeql.yml +++ b/.github/workflows/codeql.yml @@ -41,7 +41,7 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libhwy0 libhwy-dev + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexiv2-dev libtcmalloc-minimal4 libhwy0 libhwy-dev - name: Install libjxl run: | From bde73f5ce1206e0a1b822c4eaea3cdab64a8dde2 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 06:14:20 +0000 Subject: [PATCH 16/25] Use makedeb to build libjxl from source --- .github/workflows/appimage.yml | 23 +++--- tools/makedeb/PKGBUILD.libjxl | 41 ++++++++++ tools/makedeb/install.sh | 135 +++++++++++++++++++++++++++++++++ 3 files changed, 187 insertions(+), 12 deletions(-) create mode 100644 tools/makedeb/PKGBUILD.libjxl create mode 100644 tools/makedeb/install.sh diff --git a/.github/workflows/appimage.yml b/.github/workflows/appimage.yml index cc0f6b025..cecd43ad3 100644 --- a/.github/workflows/appimage.yml +++ b/.github/workflows/appimage.yml @@ -35,21 +35,20 @@ jobs: echo "Running apt update." sudo apt update echo "Installing dependencies with apt." - DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full libtcmalloc-minimal4 + DEBIAN_FRONTEND=noninteractive sudo apt install -y cmake libgtk-3-dev libgtkmm-3.0-dev liblensfun-dev librsvg2-dev liblcms2-dev libfftw3-dev libiptcdata0-dev libtiff5-dev libcanberra-gtk3-dev liblensfun-bin libexpat1-dev libbrotli-dev zlib1g-dev libinih-dev adwaita-icon-theme-full gettext libarchive-tools zstd libgif-dev libwebp-dev libwebpdemux2 + + - name: Install makedeb + run: | + echo "Installing makedeb..." + curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o makedeb.deb \ + "https://github.com/makedeb/makedeb/releases/download/v16.1.0-beta1/makedeb-beta_16.1.0-beta1_amd64_focal.deb" + DEBIAN_FRONTEND=noninteractive sudo dpkg -i makedeb.deb - name: Install libjxl + working-directory: tools/makedeb run: | - echo "Downloading and installing libhwy and libjxl..." - VERSION_UBUNTU=20.04 - VERSION_JXL=0.10.2 - DEB_URL_HWYDEV="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy-dev_0.16.0-0focal1_amd64.deb" - DEB_URL_HWY="https://launchpad.net/~ubuntuhandbook1/+archive/ubuntu/apps/+files/libhwy0_0.16.0-0focal1_amd64.deb" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy-dev.deb "$DEB_URL_HWYDEV" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libhwy.deb "$DEB_URL_HWY" - curl -Ss -qgb "" -fLC - --retry 3 --retry-delay 3 -o libjxl-debs.tar.gz \ - "https://github.com/libjxl/libjxl/releases/download/v${VERSION_JXL}/jxl-debs-amd64-ubuntu-${VERSION_UBUNTU}-v${VERSION_JXL}.tar.gz" - tar xf libjxl-debs.tar.gz - DEBIAN_FRONTEND=noninteractive sudo dpkg -i libhwy-dev.deb libhwy.deb jxl_${VERSION_JXL}_amd64.deb libjxl-dev_${VERSION_JXL}_amd64.deb libjxl_${VERSION_JXL}_amd64.deb + echo "Building and installing libjxl..." + makedeb -si --no-confirm -p PKGBUILD.libjxl - name: Install Exiv2 run: | diff --git a/tools/makedeb/PKGBUILD.libjxl b/tools/makedeb/PKGBUILD.libjxl new file mode 100644 index 000000000..b63801812 --- /dev/null +++ b/tools/makedeb/PKGBUILD.libjxl @@ -0,0 +1,41 @@ +# Maintainer: RawTherapee Developers + +_pkgname="libjxl" +pkgname="$_pkgname" +pkgver='0.10.2' +pkgrel='1' +pkgdesc='JPEG XL image format reference implementation' +url='https://github.com/libjxl/libjxl' +license=('BSD') +arch=('amd64') + +depends=('libgif-dev' 'libjpeg-dev' 'libopenexr-dev' 'libpng-dev' 'libwebp-dev') +makedepends=('cmake' 'pkg-config' 'libbrotli-dev' 'libgflags-dev') + +_pkgsrc="$_pkgname" +source=("git+$url.git#tag=v$pkgver") +sha256sums=('SKIP') + +prepare() { + cd "$_pkgsrc" + git submodule update --init --recursive --depth 1 --recommend-shallow +} + +build() { + local _cmake_options=( + -B build + -S "$_pkgsrc" + -DCMAKE_BUILD_TYPE=Release + -DCMAKE_INSTALL_PREFIX='/usr' + -DJPEGXL_FORCE_SYSTEM_BROTLI=ON + -DBUILD_TESTING=OFF + -Wno-dev + ) + + cmake "${_cmake_options[@]}" + cmake --build build --parallel +} + +package() { + DESTDIR="$pkgdir" cmake --install build +} diff --git a/tools/makedeb/install.sh b/tools/makedeb/install.sh new file mode 100644 index 000000000..409c0f5a1 --- /dev/null +++ b/tools/makedeb/install.sh @@ -0,0 +1,135 @@ +#!/usr/bin/env bash +# The installation script for makedeb. This is the script that's shown and gets ran from https://makedeb.org. +set -e + +# Handy env vars. +MAKEDEB_RELEASE="${MAKEDEB_RELEASE:-}" +makedeb_url='makedeb.org' +color_normal="$(tput sgr0)" +color_bold="$(tput bold)" +color_green="$(tput setaf 77)" +color_orange="$(tput setaf 214)" +color_blue="$(tput setaf 14)" +color_red="$(tput setaf 202)" +color_purple="$(tput setaf 135)" +noninteractive_mode=0 +apt_args=() + +# Handy functions. +msg() { + echo "${color_blue}[>]${color_normal} ${1}" +} + +error() { + echo "${color_red}[!]${color_normal} ${1}" +} + +question() { + echo "${color_purple}[?]${color_normal} ${1}" +} + +die_cmd() { + error "${1}" + exit 1 +} + +answered_yes() { + if [[ "${1}" == "" || "${1,,}" == "y" ]]; then + return 0 + else + return 1 + fi +} + +# Pre-checks. +if [[ "${UID}" == "0" ]]; then + die_cmd "This script is not allowed to be run under the root user. Please run as a normal user and try again." +fi + +# Program start. +echo "-------------------------" +echo "${color_green}[#]${color_normal} ${color_orange}makedeb Installer${color_normal} ${color_green}[#]${color_normal}" +echo "-------------------------" +echo + +if ! echo "${-}" | grep -q i; then + msg "Running in noninteractive mode." + noninteractive_mode=1 + export DEBIAN_FRONTEND=noninteractive + apt_args+=('-y') +fi + +msg "Ensuring needed packages are installed..." +if ! sudo apt-get update "${apt_args[@]}"; then + die_cmd "Failed to update APT cache." +fi + +missing_dependencies=() +dpkg-query -W 'wget' > /dev/null 2>&1 || missing_dependencies+=('wget') +dpkg-query -W 'gpg' > /dev/null 2>&1 || missing_dependencies+=('gpg') + +if ! ( test -z "${missing_dependencies[*]}" || sudo apt-get install "${apt_args[@]}" --mark-auto "${missing_dependencies[@]}" ); then + die_cmd "Failed to install needed packages." +fi + +echo + +if (( "${noninteractive_mode}" )) && [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then + error "The script was ran in noninteractive mode, but no makedeb package was specified to install." + error "Please specify a package to install via the 'MAKEDEB_RELEASE' environment variable." + die_cmd "Available packages are 'makedeb', 'makedeb-beta', and 'makedeb-alpha'." +elif [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then + msg "Multiple releases of makedeb are available for installation." + msg "Currently, you can install one of 'makedeb', 'makedeb-beta', or" + msg "'makedeb-alpha'." + + while true; do + read -p "$(question "Which release would you like? ")" MAKEDEB_RELEASE + + if ! echo "${MAKEDEB_RELEASE}" | grep -qE '^makedeb$|^makedeb-beta$|^makedeb-alpha$'; then + error "Invalid response: ${MAKEDEB_RELEASE}" + continue + fi + + break + done + + echo +fi + +case "${MAKEDEB_RELEASE}" in + makedeb|makedeb-alpha|makedeb-beta) + ;; + *) + echo + error "Invalid \$MAKEDEB_RELEASE: '${MAKEDEB_RELEASE}'" + exit 1 ;; +esac + +msg "Setting up makedeb APT repository..." +if ! wget -qO - "https://proget.${makedeb_url}/debian-feeds/makedeb.pub" | gpg --dearmor | sudo tee /usr/share/keyrings/makedeb-archive-keyring.gpg 1> /dev/null; then + die_cmd "Failed to set up makedeb APT repository." +fi +echo "deb [signed-by=/usr/share/keyrings/makedeb-archive-keyring.gpg arch=all] https://proget.${makedeb_url} makedeb main" | sudo tee /etc/apt/sources.list.d/makedeb.list 1> /dev/null + +msg "Updating APT cache..." +if ! sudo apt-get update "${apt_args[@]}"; then + die_cmd "Failed to update APT cache." +fi + +echo +msg "Installing '${MAKEDEB_RELEASE}'..." +if ! sudo apt-get install "${apt_args[@]}" -- "${MAKEDEB_RELEASE}"; then + die_cmd "Failed to install package." +fi + +msg "Finished! If you need help of any kind, feel free to reach out:" +echo +msg "${color_bold}makedeb Homepage:${color_normal} https://${makedeb_url}" +msg "${color_bold}makedeb Package Repository:${color_normal} https://mpr.${makedeb_url}" +msg "${color_bold}makedeb Documentation:${color_normal} https://docs.${makedeb_url}" +msg "${color_bold}makedeb Support:${color_normal} https://docs.${makedeb_url}/support/obtaining-support" +echo +msg "Enjoy makedeb!" + +# vim: set sw=4 expandtab: From 1ad5ec3e9ef779d52614e38f6ea4252817109e1d Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 14 Apr 2024 08:02:20 +0000 Subject: [PATCH 17/25] Remove makedeb installer script --- tools/makedeb/install.sh | 135 --------------------------------------- 1 file changed, 135 deletions(-) delete mode 100644 tools/makedeb/install.sh diff --git a/tools/makedeb/install.sh b/tools/makedeb/install.sh deleted file mode 100644 index 409c0f5a1..000000000 --- a/tools/makedeb/install.sh +++ /dev/null @@ -1,135 +0,0 @@ -#!/usr/bin/env bash -# The installation script for makedeb. This is the script that's shown and gets ran from https://makedeb.org. -set -e - -# Handy env vars. -MAKEDEB_RELEASE="${MAKEDEB_RELEASE:-}" -makedeb_url='makedeb.org' -color_normal="$(tput sgr0)" -color_bold="$(tput bold)" -color_green="$(tput setaf 77)" -color_orange="$(tput setaf 214)" -color_blue="$(tput setaf 14)" -color_red="$(tput setaf 202)" -color_purple="$(tput setaf 135)" -noninteractive_mode=0 -apt_args=() - -# Handy functions. -msg() { - echo "${color_blue}[>]${color_normal} ${1}" -} - -error() { - echo "${color_red}[!]${color_normal} ${1}" -} - -question() { - echo "${color_purple}[?]${color_normal} ${1}" -} - -die_cmd() { - error "${1}" - exit 1 -} - -answered_yes() { - if [[ "${1}" == "" || "${1,,}" == "y" ]]; then - return 0 - else - return 1 - fi -} - -# Pre-checks. -if [[ "${UID}" == "0" ]]; then - die_cmd "This script is not allowed to be run under the root user. Please run as a normal user and try again." -fi - -# Program start. -echo "-------------------------" -echo "${color_green}[#]${color_normal} ${color_orange}makedeb Installer${color_normal} ${color_green}[#]${color_normal}" -echo "-------------------------" -echo - -if ! echo "${-}" | grep -q i; then - msg "Running in noninteractive mode." - noninteractive_mode=1 - export DEBIAN_FRONTEND=noninteractive - apt_args+=('-y') -fi - -msg "Ensuring needed packages are installed..." -if ! sudo apt-get update "${apt_args[@]}"; then - die_cmd "Failed to update APT cache." -fi - -missing_dependencies=() -dpkg-query -W 'wget' > /dev/null 2>&1 || missing_dependencies+=('wget') -dpkg-query -W 'gpg' > /dev/null 2>&1 || missing_dependencies+=('gpg') - -if ! ( test -z "${missing_dependencies[*]}" || sudo apt-get install "${apt_args[@]}" --mark-auto "${missing_dependencies[@]}" ); then - die_cmd "Failed to install needed packages." -fi - -echo - -if (( "${noninteractive_mode}" )) && [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then - error "The script was ran in noninteractive mode, but no makedeb package was specified to install." - error "Please specify a package to install via the 'MAKEDEB_RELEASE' environment variable." - die_cmd "Available packages are 'makedeb', 'makedeb-beta', and 'makedeb-alpha'." -elif [[ "${MAKEDEB_RELEASE:+x}" == '' ]]; then - msg "Multiple releases of makedeb are available for installation." - msg "Currently, you can install one of 'makedeb', 'makedeb-beta', or" - msg "'makedeb-alpha'." - - while true; do - read -p "$(question "Which release would you like? ")" MAKEDEB_RELEASE - - if ! echo "${MAKEDEB_RELEASE}" | grep -qE '^makedeb$|^makedeb-beta$|^makedeb-alpha$'; then - error "Invalid response: ${MAKEDEB_RELEASE}" - continue - fi - - break - done - - echo -fi - -case "${MAKEDEB_RELEASE}" in - makedeb|makedeb-alpha|makedeb-beta) - ;; - *) - echo - error "Invalid \$MAKEDEB_RELEASE: '${MAKEDEB_RELEASE}'" - exit 1 ;; -esac - -msg "Setting up makedeb APT repository..." -if ! wget -qO - "https://proget.${makedeb_url}/debian-feeds/makedeb.pub" | gpg --dearmor | sudo tee /usr/share/keyrings/makedeb-archive-keyring.gpg 1> /dev/null; then - die_cmd "Failed to set up makedeb APT repository." -fi -echo "deb [signed-by=/usr/share/keyrings/makedeb-archive-keyring.gpg arch=all] https://proget.${makedeb_url} makedeb main" | sudo tee /etc/apt/sources.list.d/makedeb.list 1> /dev/null - -msg "Updating APT cache..." -if ! sudo apt-get update "${apt_args[@]}"; then - die_cmd "Failed to update APT cache." -fi - -echo -msg "Installing '${MAKEDEB_RELEASE}'..." -if ! sudo apt-get install "${apt_args[@]}" -- "${MAKEDEB_RELEASE}"; then - die_cmd "Failed to install package." -fi - -msg "Finished! If you need help of any kind, feel free to reach out:" -echo -msg "${color_bold}makedeb Homepage:${color_normal} https://${makedeb_url}" -msg "${color_bold}makedeb Package Repository:${color_normal} https://mpr.${makedeb_url}" -msg "${color_bold}makedeb Documentation:${color_normal} https://docs.${makedeb_url}" -msg "${color_bold}makedeb Support:${color_normal} https://docs.${makedeb_url}/support/obtaining-support" -echo -msg "Enjoy makedeb!" - -# vim: set sw=4 expandtab: From 4d715cf281c53eb49e1cb3d41afff776f9632d34 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 16 Apr 2024 15:49:40 +0000 Subject: [PATCH 18/25] Make requested changes --- rtengine/imageio.cc | 91 +++++++++++++++++++++------------------------ rtengine/imageio.h | 2 +- rtengine/utils.cc | 3 +- rtgui/thumbnail.cc | 34 +++++++++-------- 4 files changed, 64 insertions(+), 66 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index c6576b3c8..5f5573265 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -24,6 +24,7 @@ #include #include #include + #include #include #include @@ -31,10 +32,7 @@ #include #ifdef LIBJXL -#include -#include "jxl/decode.h" #include "jxl/decode_cxx.h" -#include "jxl/resizable_parallel_runner.h" #include "jxl/resizable_parallel_runner_cxx.h" #endif @@ -832,17 +830,16 @@ int ImageIO::loadTIFF (const Glib::ustring &fname) #ifdef LIBJXL #define _PROFILE_ JXL_COLOR_PROFILE_TARGET_ORIGINAL // adapted from libjxl -int ImageIO::loadJxl(const Glib::ustring &fname) +int ImageIO::loadJXL(const Glib::ustring &fname) { if (pl) { pl->setProgressStr("PROGRESSBAR_LOADJXL"); pl->setProgress(0.0); } - std::vector icc_profile; - - gpointer buffer = nullptr; - size_t buffer_size = 0; + std::vector icc_profile; + std::vector buffer; + std::size_t buffer_size = 0; JxlBasicInfo info = {}; JxlPixelFormat format = {}; @@ -852,28 +849,25 @@ int ImageIO::loadJxl(const Glib::ustring &fname) format.endianness = JXL_NATIVE_ENDIAN; format.align = 0; - // get file contents - std::ifstream instream(fname.c_str(), std::ios::in | std::ios::binary); - std::vector compressed( - (std::istreambuf_iterator(instream)), - std::istreambuf_iterator()); - instream.close(); + std::string const contents = Glib::file_get_contents(fname); + std::vector const compressed(contents.begin(), contents.end()); // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); auto dec = JxlDecoderMake(nullptr); + if (JXL_DEC_SUCCESS != - JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | - JXL_DEC_COLOR_ENCODING | - JXL_DEC_FULL_IMAGE)) { + JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | + JXL_DEC_COLOR_ENCODING | + JXL_DEC_FULL_IMAGE)) { g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != - JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, - runner.get())) { + JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, + runner.get())) { g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); return IMIO_HEADERERROR; } @@ -897,31 +891,32 @@ int ImageIO::loadJxl(const Glib::ustring &fname) // check for ICC profile deleteLoadedProfileData(); embProfile = nullptr; - size_t icc_size = 0; + std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != #if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) - JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) + JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else - JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) + JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) #endif - ) { + ) { g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); } if (icc_size > 0) { icc_profile.resize(icc_size); + if (JXL_DEC_SUCCESS != #if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) - JxlDecoderGetColorAsICCProfile( - dec.get(), &format, _PROFILE_, - icc_profile.data(), icc_profile.size()) + JxlDecoderGetColorAsICCProfile( + dec.get(), &format, _PROFILE_, + icc_profile.data(), icc_profile.size()) #else - JxlDecoderGetColorAsICCProfile( - dec.get(), _PROFILE_, - icc_profile.data(), icc_profile.size()) + JxlDecoderGetColorAsICCProfile( + dec.get(), _PROFILE_, + icc_profile.data(), icc_profile.size()) #endif - ) { + ) { g_printerr( "Warning: JxlDecoderGetColorAsICCProfile failed\n"); } else { @@ -932,7 +927,10 @@ int ImageIO::loadJxl(const Glib::ustring &fname) g_printerr("Warning: Empty ICC data.\n"); } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { - format.data_type = JXL_TYPE_FLOAT; + // Note: If this assert is ever triggered, it should be changed + // to an assignment. We want the maximum bit depth the decoder + // can provide regardless of the original encoding intent. + assert(format.data_type == JXL_TYPE_FLOAT); if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { @@ -940,20 +938,19 @@ int ImageIO::loadJxl(const Glib::ustring &fname) return IMIO_READERROR; } - buffer = g_malloc(buffer_size); - if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer, buffer_size)) { + buffer.resize(buffer_size); + + if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer.data(), buffer.size())) { g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); - g_free(buffer); return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || status == JXL_DEC_FRAME) { // Nothing to do. If the image is an animation, more full frames // may be decoded. This example only keeps the first one. + break; } else if (status == JXL_DEC_SUCCESS) { - // All decoding successfully finished. - // It's not required to call JxlDecoderReleaseInput(dec.get()) - // since the decoder will be destroyed. + // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { g_printerr("Error: Already provided all input\n"); @@ -967,26 +964,24 @@ int ImageIO::loadJxl(const Glib::ustring &fname) } } // end grand decode loop - unsigned int width = info.xsize; - unsigned int height = info.ysize; + std::size_t width = info.xsize; + std::size_t height = info.ysize; allocate(width, height); - int line_length = width * 3 * 4; + std::size_t line_length = width * 3 * 4; - for (size_t row = 0; row < height; ++row) { - setScanline (row, ((const unsigned char*)buffer) + (row * line_length), 32); + for (std::size_t row = 0; row < height; ++row) { + setScanline(row, ((const unsigned char*)buffer.data()) + (row * line_length), 32); if (pl && !(row % 100)) { - pl->setProgress ((double)(row) / height); + pl->setProgress((double)(row) / height); } } - g_free(buffer); - if (pl) { - pl->setProgressStr ("PROGRESSBAR_READY"); - pl->setProgress (1.0); + pl->setProgressStr("PROGRESSBAR_READY"); + pl->setProgress(1.0); } return IMIO_SUCCESS; @@ -1484,7 +1479,7 @@ int ImageIO::load (const Glib::ustring &fname) return loadJPEG (fname); #ifdef LIBJXL } else if (hasJxlExtension(fname)) { - return loadJxl(fname); + return loadJXL(fname); #endif } else if (hasTiffExtension(fname)) { return loadTIFF (fname); diff --git a/rtengine/imageio.h b/rtengine/imageio.h index cfc54e629..3703839b2 100644 --- a/rtengine/imageio.h +++ b/rtengine/imageio.h @@ -91,7 +91,7 @@ public: int save (const Glib::ustring &fname) const; #ifdef LIBJXL - int loadJxl (const Glib::ustring &fname); + int loadJXL (const Glib::ustring &fname); #endif int loadPNG (const Glib::ustring &fname); diff --git a/rtengine/utils.cc b/rtengine/utils.cc index 4c4f18691..f631a410a 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -240,8 +240,7 @@ bool hasJpegExtension(const Glib::ustring& filename) #ifdef LIBJXL bool hasJxlExtension(const Glib::ustring& filename) { - const Glib::ustring extension = getFileExtension(filename); - return extension == "jxl"; + return getFileExtension(filename) == "jxl"; } #endif diff --git a/rtgui/thumbnail.cc b/rtgui/thumbnail.cc index 18829d9e1..84f81ce76 100644 --- a/rtgui/thumbnail.cc +++ b/rtgui/thumbnail.cc @@ -182,12 +182,12 @@ Glib::ustring Thumbnail::xmpSidecarPath(const Glib::ustring &imagePath) return rtengine::Exiv2Metadata::xmpSidecarPath(imagePath); } -void Thumbnail::_generateThumbnailImage () +void Thumbnail::_generateThumbnailImage() { // delete everything loaded into memory delete tpp; tpp = nullptr; - delete [] lastImg; + delete[] lastImg; lastImg = nullptr; tw = options.maxThumbnailWidth; th = options.maxThumbnailHeight; @@ -211,21 +211,24 @@ void Thumbnail::_generateThumbnailImage () bool quick = false; rtengine::eSensorType sensorType = rtengine::ST_NONE; - if ( initial_ && options.internalThumbIfUntouched) { + + if (initial_ && options.internalThumbIfUntouched) { quick = true; - tpp = rtengine::Thumbnail::loadQuickFromRaw (fname, sensorType, tw, th, 1, TRUE); + tpp = rtengine::Thumbnail::loadQuickFromRaw(fname, sensorType, tw, th, 1, TRUE); } - if ( tpp == nullptr ) { + if (!tpp) { quick = false; - tpp = rtengine::Thumbnail::loadFromRaw (fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); + tpp = rtengine::Thumbnail::loadFromRaw(fname, sensorType, tw, th, 1, pparams->wb.equal, pparams->wb.observer, TRUE, &(pparams->raw)); } cfs.sensortype = sensorType; + if (tpp) { cfs.format = FT_Raw; cfs.thumbImgType = quick ? CacheImageData::QUICK_THUMBNAIL : CacheImageData::FULL_THUMBNAIL; - infoFromImage (fname); + infoFromImage(fname); + if (!quick) { cfs.width = tpp->full_width; cfs.height = tpp->full_height; @@ -234,7 +237,8 @@ void Thumbnail::_generateThumbnailImage () if (!tpp) { // this will load formats supported by imagio (jpg, png, jxl, and tiff) - tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + tpp = rtengine::Thumbnail::loadFromImage(fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer); + if (tpp) { cfs.format = FT_Custom; infoFromImage(fname); @@ -243,12 +247,12 @@ void Thumbnail::_generateThumbnailImage () if (tpp) { tpp->getAutoWBMultipliers(cfs.redAWBMul, cfs.greenAWBMul, cfs.blueAWBMul); - _saveThumbnail (); + _saveThumbnail(); cfs.supported = true; - cfs.save (getCacheFileName ("data", ".txt")); + cfs.save(getCacheFileName("data", ".txt")); - generateExifDateTimeStrings (); + generateExifDateTimeStrings(); } } @@ -718,10 +722,10 @@ rtengine::IImage8* Thumbnail::processThumbImage (const rtengine::procparams::Pro MyMutex::MyLock lock(mutex); - if ( tpp == nullptr ) { + if (!tpp) { _loadThumbnail(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } } @@ -755,7 +759,7 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro _generateThumbnailImage(); - if ( tpp == nullptr ) { + if (!tpp) { return nullptr; } @@ -961,7 +965,7 @@ void Thumbnail::_loadThumbnail(bool firstTrial) _loadThumbnail (false); } - if (tpp == nullptr) { + if (!tpp) { return; } } else if (!succ) { From 8c5fc60a7d3c3fb62f13f88d7c284f0ba7bd391f Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 21 Apr 2024 02:17:19 +0000 Subject: [PATCH 19/25] Make requested changes * Remove cast in scanline * Improve Glib::ustring conversion --- rtengine/imageio.cc | 36 ++++++++++++++++++++---------------- rtengine/utils.cc | 19 +++++++++++++++++++ rtengine/utils.h | 4 ++++ 3 files changed, 43 insertions(+), 16 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 5f5573265..44297b10f 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -25,17 +25,17 @@ #include #include +#ifdef LIBJXL +#include "jxl/decode_cxx.h" +#include "jxl/resizable_parallel_runner_cxx.h" +#endif + #include #include #include #include #include -#ifdef LIBJXL -#include "jxl/decode_cxx.h" -#include "jxl/resizable_parallel_runner_cxx.h" -#endif - #ifdef _WIN32 #include #else @@ -849,8 +849,12 @@ int ImageIO::loadJXL(const Glib::ustring &fname) format.endianness = JXL_NATIVE_ENDIAN; format.align = 0; - std::string const contents = Glib::file_get_contents(fname); - std::vector const compressed(contents.begin(), contents.end()); + std::vector const compressed = getFileData(fname); + + if (compressed.empty()) { + g_printerr("Error: loadJXL failed to get data from file\n"); + return IMIO_READERROR; + } // multi-threaded parallel runner. auto runner = JxlResizableParallelRunnerMake(nullptr); @@ -894,7 +898,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) @@ -907,7 +911,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0,8,0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) JxlDecoderGetColorAsICCProfile( dec.get(), &format, _PROFILE_, icc_profile.data(), icc_profile.size()) @@ -927,9 +931,9 @@ int ImageIO::loadJXL(const Glib::ustring &fname) g_printerr("Warning: Empty ICC data.\n"); } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { - // Note: If this assert is ever triggered, it should be changed - // to an assignment. We want the maximum bit depth the decoder - // can provide regardless of the original encoding intent. + // Note: If assert is triggered, change to assignment. + // We want maximum bit depth from the decoder, + // regardless of the original encoding intent. assert(format.data_type == JXL_TYPE_FLOAT); if (JXL_DEC_SUCCESS != @@ -953,7 +957,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { - g_printerr("Error: Already provided all input\n"); + g_printerr("Error: Decoder needs more input data\n"); return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { g_printerr("Error: Decoder error\n"); @@ -962,7 +966,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) g_printerr("Error: Unknown decoder status\n"); return IMIO_READERROR; } - } // end grand decode loop + } // end grand decode loop std::size_t width = info.xsize; std::size_t height = info.ysize; @@ -972,10 +976,10 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t line_length = width * 3 * 4; for (std::size_t row = 0; row < height; ++row) { - setScanline(row, ((const unsigned char*)buffer.data()) + (row * line_length), 32); + setScanline(row, buffer.data() + (row * line_length), 32); if (pl && !(row % 100)) { - pl->setProgress((double)(row) / height); + pl->setProgress((double)(row + 1) / height); } } diff --git a/rtengine/utils.cc b/rtengine/utils.cc index f631a410a..6a8321d1c 100644 --- a/rtengine/utils.cc +++ b/rtengine/utils.cc @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "rt_math.h" #include "utils.h" @@ -222,6 +224,23 @@ void vflip(unsigned char* img, int w, int h) } } +std::vector getFileData(const Glib::ustring &filename) +{ + try { + const std::string fn = Glib::filename_from_utf8(filename); + std::ifstream instream(fn, std::ios::in | std::ios::binary); + + std::vector contents( + (std::istreambuf_iterator(instream)), + std::istreambuf_iterator()); + + instream.close(); + return contents; + } catch (...) { + return {}; + } +} + Glib::ustring getFileExtension(const Glib::ustring& filename) { const Glib::ustring::size_type lastdot_pos = filename.find_last_of('.'); diff --git a/rtengine/utils.h b/rtengine/utils.h index 7ff16c79b..5dec93f51 100644 --- a/rtengine/utils.h +++ b/rtengine/utils.h @@ -18,6 +18,8 @@ */ #pragma once +#include + #include #include @@ -43,6 +45,8 @@ constexpr typename std::underlying_type::type toUnderlying(ENUM value) return static_cast::type>(value); } +std::vector getFileData(const Glib::ustring &filename); + // Return lower case extension without the "." or "" if the given name contains no "." Glib::ustring getFileExtension(const Glib::ustring& filename); // Return true if file has .jpeg or .jpg extension (ignoring case) From 106ade3d8d5c4ba1a0d0fe231cbefa7f0024d684 Mon Sep 17 00:00:00 2001 From: xiota Date: Sat, 25 May 2024 06:49:09 +0000 Subject: [PATCH 20/25] Fix version for libjxl API change --- rtengine/imageio.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 44297b10f..22f796e7d 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -898,7 +898,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::size_t icc_size = 0; if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) JxlDecoderGetICCProfileSize(dec.get(), &format, _PROFILE_, &icc_size) #else JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) @@ -911,7 +911,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.resize(icc_size); if (JXL_DEC_SUCCESS != -#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 8, 0) +#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0) JxlDecoderGetColorAsICCProfile( dec.get(), &format, _PROFILE_, icc_profile.data(), icc_profile.size()) From a5954ad4c238c7fc801700f6b6a3e75959f0913b Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 26 May 2024 11:11:07 +0000 Subject: [PATCH 21/25] Switch g_printerr to std::cerr --- rtengine/imageio.cc | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/rtengine/imageio.cc b/rtengine/imageio.cc index 22f796e7d..8ecadd46c 100644 --- a/rtengine/imageio.cc +++ b/rtengine/imageio.cc @@ -852,7 +852,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) std::vector const compressed = getFileData(fname); if (compressed.empty()) { - g_printerr("Error: loadJXL failed to get data from file\n"); + std::cerr << "Error: loadJXL failed to get data from file" << std::endl; return IMIO_READERROR; } @@ -865,14 +865,14 @@ int ImageIO::loadJXL(const Glib::ustring &fname) JxlDecoderSubscribeEvents(dec.get(), JXL_DEC_BASIC_INFO | JXL_DEC_COLOR_ENCODING | JXL_DEC_FULL_IMAGE)) { - g_printerr("Error: JxlDecoderSubscribeEvents failed\n"); + std::cerr << "Error: JxlDecoderSubscribeEvents failed" << std::endl; return IMIO_HEADERERROR; } if (JXL_DEC_SUCCESS != JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner, runner.get())) { - g_printerr("Error: JxlDecoderSetParallelRunner failed\n"); + std::cerr << "Error: JxlDecoderSetParallelRunner failed" << std::endl; return IMIO_HEADERERROR; } @@ -884,7 +884,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) if (status == JXL_DEC_BASIC_INFO) { if (JXL_DEC_SUCCESS != JxlDecoderGetBasicInfo(dec.get(), &info)) { - g_printerr("Error: JxlDecoderGetBasicInfo failed\n"); + std::cerr << "Error: JxlDecoderGetBasicInfo failed" << std::endl; return IMIO_HEADERERROR; } @@ -904,7 +904,7 @@ int ImageIO::loadJXL(const Glib::ustring &fname) JxlDecoderGetICCProfileSize(dec.get(), _PROFILE_, &icc_size) #endif ) { - g_printerr("Warning: JxlDecoderGetICCProfileSize failed\n"); + std::cerr << "Warning: JxlDecoderGetICCProfileSize failed" << std::endl; } if (icc_size > 0) { @@ -921,14 +921,13 @@ int ImageIO::loadJXL(const Glib::ustring &fname) icc_profile.data(), icc_profile.size()) #endif ) { - g_printerr( - "Warning: JxlDecoderGetColorAsICCProfile failed\n"); + std::cerr << "Warning: JxlDecoderGetColorAsICCProfile failed" << std::endl; } else { embProfile = cmsOpenProfileFromMem(icc_profile.data(), icc_profile.size()); } } else { - g_printerr("Warning: Empty ICC data.\n"); + std::cerr << "Warning: Empty ICC data." << std::endl; } } else if (status == JXL_DEC_NEED_IMAGE_OUT_BUFFER) { // Note: If assert is triggered, change to assignment. @@ -938,14 +937,14 @@ int ImageIO::loadJXL(const Glib::ustring &fname) if (JXL_DEC_SUCCESS != JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) { - g_printerr("Error: JxlDecoderImageOutBufferSize failed\n"); + std::cerr << "Error: JxlDecoderImageOutBufferSize failed" << std::endl; return IMIO_READERROR; } buffer.resize(buffer_size); if (JXL_DEC_SUCCESS != JxlDecoderSetImageOutBuffer(dec.get(), &format, buffer.data(), buffer.size())) { - g_printerr("Error: JxlDecoderSetImageOutBuffer failed\n"); + std::cerr << "Error: JxlDecoderSetImageOutBuffer failed" << std::endl; return IMIO_READERROR; } } else if (status == JXL_DEC_FULL_IMAGE || @@ -957,13 +956,13 @@ int ImageIO::loadJXL(const Glib::ustring &fname) // Decoding complete. Decoder will be released automatically. break; } else if (status == JXL_DEC_NEED_MORE_INPUT) { - g_printerr("Error: Decoder needs more input data\n"); + std::cerr << "Error: Decoder needs more input data" << std::endl; return IMIO_READERROR; } else if (status == JXL_DEC_ERROR) { - g_printerr("Error: Decoder error\n"); + std::cerr << "Error: Decoder error" << std::endl; return IMIO_READERROR; } else { - g_printerr("Error: Unknown decoder status\n"); + std::cerr << "Error: Unknown decoder status" << std::endl; return IMIO_READERROR; } } // end grand decode loop From 40f9eefabecc78342155d228f5abf87b80544fe9 Mon Sep 17 00:00:00 2001 From: xiota Date: Sun, 26 May 2024 11:23:41 +0000 Subject: [PATCH 22/25] Add libjxl version to AboutThisBuild.txt --- AboutThisBuild.txt.in | 1 + CMakeLists.txt | 9 ++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 4d8f4f3fe..065b6c6cc 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -8,6 +8,7 @@ System: ${SYSTEM} Bit depth: ${PROC_BIT_DEPTH} Gtkmm: V${GTKMM_VERSION} Lensfun: V${LENSFUN_VERSION} +libjxl: V${JXL_VERSION} Build type: ${BUILD_TYPE} Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} diff --git a/CMakeLists.txt b/CMakeLists.txt index fe7884ee9..b6c053dd0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -560,14 +560,19 @@ if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO") else() set(JXL_REQUIRED "") endif() -pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl libjxl_threads) +pkg_check_modules(JXL ${JXL_REQUIRED} IMPORTED_TARGET libjxl) +pkg_check_modules(JXLTHREADS ${JXL_REQUIRED} IMPORTED_TARGET libjxl_threads) if(JXL_FOUND) if(WITH_JXL OR WITH_JXL STREQUAL "AUTO") add_definitions(-DLIBJXL) + list(APPEND JXL_INCLUDE_DIRS ${JXLTHREADS_INCLUDE_DIRS}) + list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") + set(JXLTHREADS_INCLUDE_DIRS "") + set(JXLTHREADS_LIBRARIES "") endif() endif() @@ -751,6 +756,7 @@ if(NOT APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION}) endif() @@ -780,6 +786,7 @@ elseif(APPLE) -DGTKMM_VERSION:STRING=${GTKMM_VERSION} -DOPTION_OMP:STRING=${OPTION_OMP} -DWITH_MYFILE_MMAP:STRING=${WITH_MYFILE_MMAP} + -DJXL_VERSION:STRING=${JXL_VERSION} -DLENSFUN_VERSION:STRING=${LENSFUN_VERSION} -P ${PROJECT_SOURCE_DIR}/UpdateInfo.cmake) else() From e81724645221e97b57e88053060fb268fddad2d5 Mon Sep 17 00:00:00 2001 From: xiota Date: Mon, 27 May 2024 21:01:59 +0000 Subject: [PATCH 23/25] AboutThisBuild: Distinguish JXL unavailable and disabled --- AboutThisBuild.txt.in | 6 +++--- CMakeLists.txt | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/AboutThisBuild.txt.in b/AboutThisBuild.txt.in index 065b6c6cc..7c42f244e 100644 --- a/AboutThisBuild.txt.in +++ b/AboutThisBuild.txt.in @@ -6,9 +6,9 @@ Compiler: ${COMPILER_INFO} Processor: ${PROC_LABEL} System: ${SYSTEM} Bit depth: ${PROC_BIT_DEPTH} -Gtkmm: V${GTKMM_VERSION} -Lensfun: V${LENSFUN_VERSION} -libjxl: V${JXL_VERSION} +Gtkmm: ${GTKMM_VERSION} +Lensfun: ${LENSFUN_VERSION} +libjxl: ${JXL_VERSION} Build type: ${BUILD_TYPE} Build flags: ${CXX_FLAGS} Link flags: ${LFLAGS} diff --git a/CMakeLists.txt b/CMakeLists.txt index b6c053dd0..18b4ef04f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -569,11 +569,14 @@ if(JXL_FOUND) list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") + set(JXL_VERSION "Disabled") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") set(JXLTHREADS_INCLUDE_DIRS "") set(JXLTHREADS_LIBRARIES "") endif() +else() + set(JXL_VERSION "Not installed") endif() # Check for libcanberra-gtk3 (sound events on Linux): From 5ea3a4b979da6af5ccf42f2840cccee91be0630e Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 28 May 2024 06:45:49 +0000 Subject: [PATCH 24/25] AboutThisBuild: Make libjxl status strings less confusing --- CMakeLists.txt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 18b4ef04f..7696270ad 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -569,14 +569,16 @@ if(JXL_FOUND) list(APPEND JXL_LIBRARIES ${JXLTHREADS_LIBRARIES}) else() message(STATUS " JXL support disabled by WITH_JXL = ${WITH_JXL}") - set(JXL_VERSION "Disabled") + string(APPEND JXL_VERSION " - Disabled") set(JXL_INCLUDE_DIRS "") set(JXL_LIBRARIES "") set(JXLTHREADS_INCLUDE_DIRS "") set(JXLTHREADS_LIBRARIES "") endif() +elseif(WITH_JXL STREQUAL "AUTO") + set(JXL_VERSION "Disabled, Auto") else() - set(JXL_VERSION "Not installed") + set(JXL_VERSION "Disabled") endif() # Check for libcanberra-gtk3 (sound events on Linux): From d2af04cea27ba951927ca6bbe704941e30f9a189 Mon Sep 17 00:00:00 2001 From: xiota Date: Tue, 28 May 2024 07:18:51 +0000 Subject: [PATCH 25/25] Add "Loading JXL" translations --- rtdata/languages/Catala | 1 + rtdata/languages/Chinese (Simplified) | 1 + rtdata/languages/Czech | 1 + rtdata/languages/Dansk | 1 + rtdata/languages/Deutsch | 1 + rtdata/languages/English (UK) | 1 + rtdata/languages/English (US) | 1 + rtdata/languages/Espanol (Castellano) | 1 + rtdata/languages/Espanol (Latin America) | 1 + rtdata/languages/Francais | 1 + rtdata/languages/Italiano | 1 + rtdata/languages/Japanese | 1 + rtdata/languages/Magyar | 1 + rtdata/languages/Nederlands | 1 + rtdata/languages/Polish | 1 + rtdata/languages/Portugues | 1 + rtdata/languages/Portugues (Brasil) | 1 + rtdata/languages/Russian | 1 + rtdata/languages/Serbian (Cyrilic Characters) | 1 + rtdata/languages/Slovenian | 1 + rtdata/languages/Swedish | 1 + rtdata/languages/default | 1 + 22 files changed, 22 insertions(+) diff --git a/rtdata/languages/Catala b/rtdata/languages/Catala index 03353cdb7..bc95d7546 100644 --- a/rtdata/languages/Catala +++ b/rtdata/languages/Catala @@ -555,6 +555,7 @@ PROFILEPANEL_TOOLTIPSAVE;Desa l'actual com a perfil.\nCtrl-click per sele PROGRESSBAR_LOADING;Carregant imatge... PROGRESSBAR_LOADINGTHUMBS;Carregant minifotos... PROGRESSBAR_LOADJPEG;Carregant fitxer JPEG... +PROGRESSBAR_LOADJXL;Carregant fitxer JXL... PROGRESSBAR_LOADPNG;Carregant fitxer PNG... PROGRESSBAR_LOADTIFF;Carregant fitxer TIFF... PROGRESSBAR_PROCESSING;Processant imatge... diff --git a/rtdata/languages/Chinese (Simplified) b/rtdata/languages/Chinese (Simplified) index f18513c15..2999c0c77 100644 --- a/rtdata/languages/Chinese (Simplified) +++ b/rtdata/languages/Chinese (Simplified) @@ -1241,6 +1241,7 @@ PROGRESSBAR_LINEDENOISE;线状噪点过滤... PROGRESSBAR_LOADING;图片加载中... PROGRESSBAR_LOADINGTHUMBS;读取缩略图... PROGRESSBAR_LOADJPEG;JPEG文件加载中... +PROGRESSBAR_LOADJXL;JXL文件加载中... PROGRESSBAR_LOADPNG;PNG文件加载中... PROGRESSBAR_LOADTIFF;TIFF文件加载中... PROGRESSBAR_NOIMAGES;未找到图片 diff --git a/rtdata/languages/Czech b/rtdata/languages/Czech index 232c094e0..995f089db 100644 --- a/rtdata/languages/Czech +++ b/rtdata/languages/Czech @@ -1306,6 +1306,7 @@ PROGRESSBAR_LINEDENOISE;Filtr linkového rušení… PROGRESSBAR_LOADING;Načítání obrázku... PROGRESSBAR_LOADINGTHUMBS;Načítání náhledů... PROGRESSBAR_LOADJPEG;Načítání JPEG... +PROGRESSBAR_LOADJXL;Načítání JXL... PROGRESSBAR_LOADPNG;Načítání PNG... PROGRESSBAR_LOADTIFF;Načítání TIFF... PROGRESSBAR_NOIMAGES;Složka neobsahuje obrázky diff --git a/rtdata/languages/Dansk b/rtdata/languages/Dansk index ed2e32616..e42f0bc83 100644 --- a/rtdata/languages/Dansk +++ b/rtdata/languages/Dansk @@ -1224,6 +1224,7 @@ PROGRESSBAR_LINEDENOISE;Linje støjfilter... PROGRESSBAR_LOADING;Indlæser billede... PROGRESSBAR_LOADINGTHUMBS;Indlæser thumbnails... PROGRESSBAR_LOADJPEG; Indlæser JPEG fil... +PROGRESSBAR_LOADJXL; Indlæser JXL fil... PROGRESSBAR_LOADPNG; Indlæser PNG fil... PROGRESSBAR_LOADTIFF;Indlæser TIFF fil... PROGRESSBAR_NOIMAGES;Ingen billeder fundet diff --git a/rtdata/languages/Deutsch b/rtdata/languages/Deutsch index 84c52d64f..677efd8e0 100644 --- a/rtdata/languages/Deutsch +++ b/rtdata/languages/Deutsch @@ -2147,6 +2147,7 @@ PROGRESSBAR_LINEDENOISE;Linienrauschfilter... PROGRESSBAR_LOADING;Lade Bild... PROGRESSBAR_LOADINGTHUMBS;Lade Miniaturbilder... PROGRESSBAR_LOADJPEG;Lade JPEG... +PROGRESSBAR_LOADJXL;Lade JXL... PROGRESSBAR_LOADPNG;Lade PNG... PROGRESSBAR_LOADTIFF;Lade TIFF... PROGRESSBAR_NOIMAGES;Keine Bilder gefunden diff --git a/rtdata/languages/English (UK) b/rtdata/languages/English (UK) index f03dbd1af..37ccdc48f 100644 --- a/rtdata/languages/English (UK) +++ b/rtdata/languages/English (UK) @@ -2259,6 +2259,7 @@ TP_WBALANCE_PATCHLABEL_TOOLTIP;Display number of read colours (max=237).\nDispla !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found diff --git a/rtdata/languages/English (US) b/rtdata/languages/English (US) index 329925625..079713ac1 100644 --- a/rtdata/languages/English (US) +++ b/rtdata/languages/English (US) @@ -2082,6 +2082,7 @@ !PROGRESSBAR_LOADING;Loading image... !PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... !PROGRESSBAR_LOADJPEG;Loading JPEG file... +!PROGRESSBAR_LOADJXL;Loading JXL file... !PROGRESSBAR_LOADPNG;Loading PNG file... !PROGRESSBAR_LOADTIFF;Loading TIFF file... !PROGRESSBAR_NOIMAGES;No images found diff --git a/rtdata/languages/Espanol (Castellano) b/rtdata/languages/Espanol (Castellano) index 32b5791dc..9f9cc48bf 100644 --- a/rtdata/languages/Espanol (Castellano) +++ b/rtdata/languages/Espanol (Castellano) @@ -2006,6 +2006,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruido de línea... PROGRESSBAR_LOADING;Cargando imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Cargando archivo JPEG... +PROGRESSBAR_LOADJXL;Cargando archivo JXL... PROGRESSBAR_LOADPNG;Cargando archivo PNG... PROGRESSBAR_LOADTIFF;Cargando archivo TIFF... PROGRESSBAR_NOIMAGES;No se encuentran imágenes diff --git a/rtdata/languages/Espanol (Latin America) b/rtdata/languages/Espanol (Latin America) index 9d5e352bd..816b237c6 100644 --- a/rtdata/languages/Espanol (Latin America) +++ b/rtdata/languages/Espanol (Latin America) @@ -1253,6 +1253,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar perfil actual.\nCtrl-click para seleccio PROGRESSBAR_LOADING;Abriendo imagen... PROGRESSBAR_LOADINGTHUMBS;Cargando miniaturas... PROGRESSBAR_LOADJPEG;Abriendo archivo JPEG... +PROGRESSBAR_LOADJXL;Abriendo archivo JXL... PROGRESSBAR_LOADPNG;Abriendo archivo PNG... PROGRESSBAR_LOADTIFF;Abriendo archivo TIFF... PROGRESSBAR_NOIMAGES;No se han encontrado imágenes diff --git a/rtdata/languages/Francais b/rtdata/languages/Francais index 33ffc861c..53e478f78 100644 --- a/rtdata/languages/Francais +++ b/rtdata/languages/Francais @@ -1210,6 +1210,7 @@ PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel\nCTRL-clic pour sé PROGRESSBAR_LOADING;Chargement de l'Image... PROGRESSBAR_LOADINGTHUMBS;Chargement des vignettes... PROGRESSBAR_LOADJPEG;Chargement du fichier JPEG... +PROGRESSBAR_LOADJXL;Chargement du fichier JXL... PROGRESSBAR_LOADPNG;Chargement du fichier PNG... PROGRESSBAR_LOADTIFF;Chargement du fichier TIFF... PROGRESSBAR_NOIMAGES;Pas d'image trouvée diff --git a/rtdata/languages/Italiano b/rtdata/languages/Italiano index 5ef63de7b..8e1f6124d 100644 --- a/rtdata/languages/Italiano +++ b/rtdata/languages/Italiano @@ -2088,6 +2088,7 @@ PROGRESSBAR_LINEDENOISE;Filtro antirumore di linea... PROGRESSBAR_LOADING;Caricamento immagine... PROGRESSBAR_LOADINGTHUMBS;Caricamento miniature... PROGRESSBAR_LOADJPEG;Caricamento JPEG... +PROGRESSBAR_LOADJXL;Caricamento JXL... PROGRESSBAR_LOADPNG;Caricamento PNG... PROGRESSBAR_LOADTIFF;Caricamento TIFF... PROGRESSBAR_NOIMAGES;Nessuna immagine trovata diff --git a/rtdata/languages/Japanese b/rtdata/languages/Japanese index 8bfbf0f42..290e42b57 100644 --- a/rtdata/languages/Japanese +++ b/rtdata/languages/Japanese @@ -2005,6 +2005,7 @@ PROGRESSBAR_LINEDENOISE;ラインノイズフィルタ。。。 PROGRESSBAR_LOADING;画像読み込み中... PROGRESSBAR_LOADINGTHUMBS;サムネイルの読み込み... PROGRESSBAR_LOADJPEG;JPEGファイル読み込み中... +PROGRESSBAR_LOADJXL;JXLファイル読み込み中... PROGRESSBAR_LOADPNG;PNGファイル読み込み中... PROGRESSBAR_LOADTIFF;TIFFファイル読み込み中... PROGRESSBAR_NOIMAGES;画像が見つかりません diff --git a/rtdata/languages/Magyar b/rtdata/languages/Magyar index 07ab9784b..8336efda8 100644 --- a/rtdata/languages/Magyar +++ b/rtdata/languages/Magyar @@ -1084,6 +1084,7 @@ PROGRESSBAR_LINEDENOISE;Sorzajszűrő... PROGRESSBAR_LOADING;Kép betöltése... PROGRESSBAR_LOADINGTHUMBS;Előnézeti képek betöltése... PROGRESSBAR_LOADJPEG;JPEG fájl betöltése... +PROGRESSBAR_LOADJXL;JXL fájl betöltése... PROGRESSBAR_LOADPNG;PNG fájl betöltése... PROGRESSBAR_LOADTIFF;TIFF fájl betöltése... PROGRESSBAR_NOIMAGES;Nem találhatóak képek diff --git a/rtdata/languages/Nederlands b/rtdata/languages/Nederlands index a0418e70c..af2862781 100644 --- a/rtdata/languages/Nederlands +++ b/rtdata/languages/Nederlands @@ -1242,6 +1242,7 @@ PROGRESSBAR_LINEDENOISE;Lijnruisfilter... PROGRESSBAR_LOADING;Afbeelding laden... PROGRESSBAR_LOADINGTHUMBS;Miniaturen laden... PROGRESSBAR_LOADJPEG;Laden JPEG-bestand... +PROGRESSBAR_LOADJXL;Laden JXL-bestand... PROGRESSBAR_LOADPNG;Laden PNG-bestand... PROGRESSBAR_LOADTIFF;Laden TIFF-bestand... PROGRESSBAR_NOIMAGES;Geen afbeeldingen diff --git a/rtdata/languages/Polish b/rtdata/languages/Polish index 94df4424f..7ad5c1792 100644 --- a/rtdata/languages/Polish +++ b/rtdata/languages/Polish @@ -1192,6 +1192,7 @@ PROGRESSBAR_LINEDENOISE;Liniowy filtr szumu... PROGRESSBAR_LOADING;Wczytywanie obrazu... PROGRESSBAR_LOADINGTHUMBS;Wczytywanie miniatur... PROGRESSBAR_LOADJPEG;Ładowanie pliku JPEG... +PROGRESSBAR_LOADJXL;Ładowanie pliku JXL... PROGRESSBAR_LOADPNG;Ładowanie pliku PNG... PROGRESSBAR_LOADTIFF;Ładowanie pliku TIFF... PROGRESSBAR_NOIMAGES;Nie znaleziono żadnych obrazów diff --git a/rtdata/languages/Portugues b/rtdata/languages/Portugues index 77ffcaf40..e037c565c 100644 --- a/rtdata/languages/Portugues +++ b/rtdata/languages/Portugues @@ -1197,6 +1197,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar o perfil atual.\nCtrl-click para selecio PROGRESSBAR_LOADING;A carregar a imagem... PROGRESSBAR_LOADINGTHUMBS;A carregar as miniaturas... PROGRESSBAR_LOADJPEG;A carregar o ficheiro JPEG... +PROGRESSBAR_LOADJXL;A carregar o ficheiro JXL... PROGRESSBAR_LOADPNG;A carregar o ficheiro PNG... PROGRESSBAR_LOADTIFF;A carregar o ficheiro TIFF... PROGRESSBAR_NOIMAGES;Não foi encontrada nenhuma imagem diff --git a/rtdata/languages/Portugues (Brasil) b/rtdata/languages/Portugues (Brasil) index c22207212..133205a09 100644 --- a/rtdata/languages/Portugues (Brasil) +++ b/rtdata/languages/Portugues (Brasil) @@ -1207,6 +1207,7 @@ PROGRESSBAR_LINEDENOISE;Filtro de ruído de linha... PROGRESSBAR_LOADING;Carregando imagem... PROGRESSBAR_LOADINGTHUMBS;Carregando miniaturas... PROGRESSBAR_LOADJPEG;Carregando arquivo JPEG... +PROGRESSBAR_LOADJXL;Carregando arquivo JXL... PROGRESSBAR_LOADPNG;Carregando arquivo PNG... PROGRESSBAR_LOADTIFF;Carregando arquivo TIFF... PROGRESSBAR_NOIMAGES;Nenhuma imagem encontrada diff --git a/rtdata/languages/Russian b/rtdata/languages/Russian index 74a08f2d3..de0846e01 100644 --- a/rtdata/languages/Russian +++ b/rtdata/languages/Russian @@ -843,6 +843,7 @@ PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\nCt PROGRESSBAR_LOADING;Загрузка изображения... PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр... PROGRESSBAR_LOADJPEG;Чтение JPEG файла... +PROGRESSBAR_LOADJXL;Чтение JXL файла... PROGRESSBAR_LOADPNG;Чтение PNG файла... PROGRESSBAR_LOADTIFF;Чтение TIFF файла... PROGRESSBAR_NOIMAGES;Изображения не найдены diff --git a/rtdata/languages/Serbian (Cyrilic Characters) b/rtdata/languages/Serbian (Cyrilic Characters) index 1cf1086bf..15bb90737 100644 --- a/rtdata/languages/Serbian (Cyrilic Characters) +++ b/rtdata/languages/Serbian (Cyrilic Characters) @@ -670,6 +670,7 @@ PROFILEPANEL_TOOLTIPSAVE;Чува тренутни профил PROGRESSBAR_LOADING;Учитавам слику... PROGRESSBAR_LOADINGTHUMBS;Учитавам приказе... PROGRESSBAR_LOADJPEG;Учитавам JPEG датотеку... +PROGRESSBAR_LOADJPEG;Учитавам JXL датотеку... PROGRESSBAR_LOADPNG;Учитавам PNG датотеку... PROGRESSBAR_LOADTIFF;Учитавам TIFF датотеку... PROGRESSBAR_NOIMAGES;Нису пронађене слике diff --git a/rtdata/languages/Slovenian b/rtdata/languages/Slovenian index 84ea9e72e..1ba151693 100644 --- a/rtdata/languages/Slovenian +++ b/rtdata/languages/Slovenian @@ -1221,6 +1221,7 @@ PROGRESSBAR_LINEDENOISE;Filter linijskega šuma... PROGRESSBAR_LOADING;Nalagam sliko... PROGRESSBAR_LOADINGTHUMBS;Nalagam predogledne sličice... PROGRESSBAR_LOADJPEG;Nalagam datoteko JPEG... +PROGRESSBAR_LOADJXL;Nalagam datoteko JXL... PROGRESSBAR_LOADPNG;Nalagam datoteko PNG... PROGRESSBAR_LOADTIFF;Nalagam datoteko TIFF... PROGRESSBAR_NOIMAGES;Ne najdem nobene slike diff --git a/rtdata/languages/Swedish b/rtdata/languages/Swedish index 0ff9f831f..edbeb9e3a 100644 --- a/rtdata/languages/Swedish +++ b/rtdata/languages/Swedish @@ -911,6 +911,7 @@ PROFILEPANEL_TOOLTIPSAVE;Spara nuvarande profil.\nCtrl-klicka för att v PROGRESSBAR_LOADING;Laddar bild... PROGRESSBAR_LOADINGTHUMBS;Laddar miniatyrbilder... PROGRESSBAR_LOADJPEG;Laddar JPEG-fil... +PROGRESSBAR_LOADJXL;Laddar JXL-fil... PROGRESSBAR_LOADPNG;Laddar PNG-fil... PROGRESSBAR_LOADTIFF;Laddar TIFF-fil... PROGRESSBAR_NOIMAGES;Inga bilder funna. diff --git a/rtdata/languages/default b/rtdata/languages/default index a6a8cdc5c..252564758 100644 --- a/rtdata/languages/default +++ b/rtdata/languages/default @@ -2086,6 +2086,7 @@ PROGRESSBAR_LINEDENOISE;Line noise filter... PROGRESSBAR_LOADING;Loading image... PROGRESSBAR_LOADINGTHUMBS;Loading thumbnails... PROGRESSBAR_LOADJPEG;Loading JPEG file... +PROGRESSBAR_LOADJXL;Loading JXL file... PROGRESSBAR_LOADPNG;Loading PNG file... PROGRESSBAR_LOADTIFF;Loading TIFF file... PROGRESSBAR_NOIMAGES;No images found