Merge branch 'dev' into libraw-copylib

This commit is contained in:
Lawrence Lee 2024-06-15 22:32:12 -07:00
commit abbaddbabd
No known key found for this signature in database
GPG Key ID: 048FF2B76A63895F
41 changed files with 971 additions and 479 deletions

View File

@ -26,7 +26,7 @@ jobs:
build_type: [release, debug]
steps:
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
@ -35,7 +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
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 "Building and installing libjxl..."
makedeb -si --no-confirm -p PKGBUILD.libjxl
- name: Install Exiv2
run: |
@ -150,7 +163,7 @@ jobs:
- name: Restore AppImage tools from cache
id: appimage-tools-cache
uses: actions/cache@v3
uses: actions/cache@v4
with:
key: appimage-tools-1
path: |
@ -203,7 +216,7 @@ jobs:
echo "ARTIFACT_NAME=$ARTIFACT_NAME" >> $GITHUB_ENV
- name: Upload artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ${{env.ARTIFACT_NAME}}.AppImage
path: ${{github.workspace}}/build/${{env.ARTIFACT_NAME}}.AppImage
@ -225,7 +238,7 @@ jobs:
echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV
- name: Publish artifacts
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}}
with:
tag_name: nightly-github-actions
@ -255,7 +268,7 @@ jobs:
echo "PUBLISH_NAME=$PUBLISH_NAME" >> $GITHUB_ENV
- name: Publish pre-dev artifacts
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}}
with:
tag_name: pre-dev-github-actions

View File

@ -32,7 +32,7 @@ jobs:
steps:
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
@ -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
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: |
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: |

View File

@ -18,14 +18,14 @@ jobs:
build:
runs-on: macos-12
steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- name: Install dependencies
run: |
date -u
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 automake | 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 automake | tee -a depslog
date -u
echo "----====Pourage====----"
cat depslog | grep Pouring
@ -97,7 +97,7 @@ jobs:
"ARTIFACT_FILE: ${ARTIFACT_FILE}" \
"PUBLISH_NAME: ${PUBLISH_NAME}"
exit
- uses: actions/upload-artifact@v3
- uses: actions/upload-artifact@v4
with:
name: ${{env.ARTIFACT_FILE}}
path: ${{env.ARTIFACT_PATH}}
@ -107,7 +107,7 @@ jobs:
zsh -c 'echo "Build completed in $(printf "%0.2f" $(($[$(date +%s)-$(cat build/stamp)]/$((60.))))) minutes"'
- name: Publish artifacts
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}}
with:
tag_name: nightly-github-actions

View File

@ -30,7 +30,7 @@ jobs:
build_type: [release, debug]
steps:
- name: Checkout source
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0
@ -54,6 +54,7 @@ jobs:
fftw:p
lensfun:p
libiptcdata:p
libjxl:p
exiv2:p
- name: Configure build
@ -190,14 +191,14 @@ jobs:
7z a -tzip "%ARTIFACT_NAME%.zip" "./%ARTIFACT_NAME%"
- name: Upload artifacts
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ${{env.ARTIFACT_NAME}}
path: build\${{env.ARTIFACT_NAME}}
- name: Upload installer
if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}}
uses: actions/upload-artifact@v3
uses: actions/upload-artifact@v4
with:
name: ${{env.ARTIFACT_NAME}}.exe
path: build\${{env.ARTIFACT_NAME}}.exe
@ -223,7 +224,7 @@ jobs:
echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)"
- name: Publish artifacts
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{github.ref_type == 'tag' || github.ref_name == 'dev'}}
with:
tag_name: nightly-github-actions
@ -232,7 +233,7 @@ jobs:
build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt
- name: Publish installer
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{matrix.build_type == 'release' && (github.ref_type == 'tag' || github.ref_name == 'dev')}}
with:
tag_name: nightly-github-actions
@ -264,7 +265,7 @@ jobs:
echo "PUBLISH_NAME=$PUBLISH_NAME" >> "$(cygpath -u $GITHUB_ENV)"
- name: Publish pre-dev artifacts
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{steps.prepare-publish-pre-dev.outcome == 'success'}}
with:
tag_name: pre-dev-github-actions
@ -274,7 +275,7 @@ jobs:
build/${{env.PUBLISH_NAME}}-AboutThisBuild.txt
- name: Publish pre-dev installer
uses: softprops/action-gh-release@v1
uses: softprops/action-gh-release@v2
if: ${{steps.prepare-publish-pre-dev.outcome == 'success' && matrix.build_type == 'release'}}
with:
tag_name: pre-dev-github-actions

View File

@ -6,8 +6,9 @@ Compiler: ${COMPILER_INFO}
Processor: ${PROC_LABEL}
System: ${SYSTEM}
Bit depth: ${PROC_BIT_DEPTH}
Gtkmm: V${GTKMM_VERSION}
Lensfun: V${LENSFUN_VERSION}
Gtkmm: ${GTKMM_VERSION}
Lensfun: ${LENSFUN_VERSION}
libjxl: ${JXL_VERSION}
Build type: ${BUILD_TYPE}
Build flags: ${CXX_FLAGS}
Link flags: ${LFLAGS}

View File

@ -248,6 +248,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)
@ -563,6 +566,32 @@ if(WITH_SYSTEM_LIBRAW)
pkg_check_modules(LIBRAW REQUIRED libraw_r>=0.21)
endif()
if(WITH_JXL AND NOT WITH_JXL STREQUAL "AUTO")
set(JXL_REQUIRED "REQUIRED")
else()
set(JXL_REQUIRED "")
endif()
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}")
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 "Disabled")
endif()
# Check for libcanberra-gtk3 (sound events on Linux):
if(UNIX AND (NOT APPLE))
option(USE_LIBCANBERRA "Build with libcanberra" ON)
@ -743,6 +772,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()
@ -772,6 +802,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()

View File

@ -10,6 +10,8 @@ set(PROC_TARGET_2_LABEL native CACHE STRING "Processor-2 label - use it for your
# The flag is different on x86 and Arm based processors
if(CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL arm64)
set(PROC_TARGET_2_FLAGS "-mcpu=native" CACHE STRING "Processor-2 flags")
elseif(CMAKE_HOST_SYSTEM_PROCESSOR MATCHES "ppc|powerpc")
set(PROC_TARGET_2_FLAGS "-mtune=native" CACHE STRING "Processor-2 flags")
else()
set(PROC_TARGET_2_FLAGS "-march=native" CACHE STRING "Processor-2 flags")
endif()

View File

@ -555,6 +555,7 @@ PROFILEPANEL_TOOLTIPSAVE;Desa l'actual com a perfil.\n<b>Ctrl-click</b> 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...

View File

@ -1244,6 +1244,7 @@ PROGRESSBAR_LINEDENOISE;线状噪点过滤...
PROGRESSBAR_LOADING;图片加载中...
PROGRESSBAR_LOADINGTHUMBS;读取缩略图...
PROGRESSBAR_LOADJPEG;JPEG文件加载中...
PROGRESSBAR_LOADJXL;JXL文件加载中...
PROGRESSBAR_LOADPNG;PNG文件加载中...
PROGRESSBAR_LOADTIFF;TIFF文件加载中...
PROGRESSBAR_NOIMAGES;未找到图片

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1253,6 +1253,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar perfil actual.\n<b>Ctrl-click</b> 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

View File

@ -1210,6 +1210,7 @@ PROFILEPANEL_TOOLTIPSAVE;Enregistrer le profil actuel\n<b>CTRL-clic</b> 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

View File

@ -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

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -1197,6 +1197,7 @@ PROFILEPANEL_TOOLTIPSAVE;Guardar o perfil atual.\n<b>Ctrl-click</b> 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

View File

@ -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

View File

@ -843,6 +843,7 @@ PROFILEPANEL_TOOLTIPSAVE;Сохранить текущий профиль\n<b>Ct
PROGRESSBAR_LOADING;Загрузка изображения...
PROGRESSBAR_LOADINGTHUMBS;Загрузка миниатюр...
PROGRESSBAR_LOADJPEG;Чтение JPEG файла...
PROGRESSBAR_LOADJXL;Чтение JXL файла...
PROGRESSBAR_LOADPNG;Чтение PNG файла...
PROGRESSBAR_LOADTIFF;Чтение TIFF файла...
PROGRESSBAR_NOIMAGES;Изображения не найдены

View File

@ -670,6 +670,7 @@ PROFILEPANEL_TOOLTIPSAVE;Чува тренутни профил
PROGRESSBAR_LOADING;Учитавам слику...
PROGRESSBAR_LOADINGTHUMBS;Учитавам приказе...
PROGRESSBAR_LOADJPEG;Учитавам JPEG датотеку...
PROGRESSBAR_LOADJPEG;Учитавам JXL датотеку...
PROGRESSBAR_LOADPNG;Учитавам PNG датотеку...
PROGRESSBAR_LOADTIFF;Учитавам TIFF датотеку...
PROGRESSBAR_NOIMAGES;Нису пронађене слике

View File

@ -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

View File

@ -911,6 +911,7 @@ PROFILEPANEL_TOOLTIPSAVE;Spara nuvarande profil.\n<b>Ctrl-klicka</b> 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.

View File

@ -2153,6 +2153,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

View File

@ -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;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

View File

@ -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;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

View File

@ -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;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

View File

@ -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()
if(NOT WITH_SYSTEM_LIBRAW)
include_directories("${CMAKE_SOURCE_DIR}/rtengine/libraw")
else()
@ -251,6 +254,7 @@ target_link_libraries(rtengine
${RSVG_LIBRARIES}
${KLT_LIBRARIES}
${EXIV2_LIBRARIES}
${JXL_LIBRARIES}
${LIBRAW_LIBRARIES}
)

View File

@ -25,6 +25,11 @@
#include <utility>
#include <vector>
#ifdef LIBJXL
#include "jxl/decode_cxx.h"
#include "jxl/resizable_parallel_runner_cxx.h"
#endif
#include <fcntl.h>
#include <glib/gstdio.h>
#include <png.h>
@ -823,6 +828,171 @@ int ImageIO::loadTIFF (const Glib::ustring &fname)
return IMIO_SUCCESS;
}
#ifdef LIBJXL
#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<std::uint8_t> icc_profile;
std::vector<std::uint8_t> buffer;
std::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;
std::vector<std::uint8_t> const compressed = getFileData(fname);
if (compressed.empty()) {
std::cerr << "Error: loadJXL failed to get data from file" << std::endl;
return IMIO_READERROR;
}
// 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)) {
std::cerr << "Error: JxlDecoderSubscribeEvents failed" << std::endl;
return IMIO_HEADERERROR;
}
if (JXL_DEC_SUCCESS !=
JxlDecoderSetParallelRunner(dec.get(), JxlResizableParallelRunner,
runner.get())) {
std::cerr << "Error: JxlDecoderSetParallelRunner failed" << std::endl;
return IMIO_HEADERERROR;
}
// 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)) {
std::cerr << "Error: JxlDecoderGetBasicInfo failed" << std::endl;
return IMIO_HEADERERROR;
}
JxlResizableParallelRunnerSetThreads(
runner.get(),
JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize));
} else if (status == JXL_DEC_COLOR_ENCODING) {
// check for ICC profile
deleteLoadedProfileData();
embProfile = nullptr;
std::size_t icc_size = 0;
if (JXL_DEC_SUCCESS !=
#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)
#endif
) {
std::cerr << "Warning: JxlDecoderGetICCProfileSize failed" << std::endl;
}
if (icc_size > 0) {
icc_profile.resize(icc_size);
if (JXL_DEC_SUCCESS !=
#if JPEGXL_NUMERIC_VERSION < JPEGXL_COMPUTE_NUMERIC_VERSION(0, 9, 0)
JxlDecoderGetColorAsICCProfile(
dec.get(), &format, _PROFILE_,
icc_profile.data(), icc_profile.size())
#else
JxlDecoderGetColorAsICCProfile(
dec.get(), _PROFILE_,
icc_profile.data(), icc_profile.size())
#endif
) {
std::cerr << "Warning: JxlDecoderGetColorAsICCProfile failed" << std::endl;
} else {
embProfile = cmsOpenProfileFromMem(icc_profile.data(),
icc_profile.size());
}
} else {
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.
// 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 !=
JxlDecoderImageOutBufferSize(dec.get(), &format, &buffer_size)) {
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())) {
std::cerr << "Error: JxlDecoderSetImageOutBuffer failed" << std::endl;
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) {
// Decoding complete. Decoder will be released automatically.
break;
} else if (status == JXL_DEC_NEED_MORE_INPUT) {
std::cerr << "Error: Decoder needs more input data" << std::endl;
return IMIO_READERROR;
} else if (status == JXL_DEC_ERROR) {
std::cerr << "Error: Decoder error" << std::endl;
return IMIO_READERROR;
} else {
std::cerr << "Error: Unknown decoder status" << std::endl;
return IMIO_READERROR;
}
} // end grand decode loop
std::size_t width = info.xsize;
std::size_t height = info.ysize;
allocate(width, height);
std::size_t line_length = width * 3 * 4;
for (std::size_t row = 0; row < height; ++row) {
setScanline(row, buffer.data() + (row * line_length), 32);
if (pl && !(row % 100)) {
pl->setProgress((double)(row + 1) / height);
}
}
if (pl) {
pl->setProgressStr("PROGRESSBAR_READY");
pl->setProgress(1.0);
}
return IMIO_SUCCESS;
}
#undef _PROFILE_
#endif // LIBJXL
int ImageIO::loadPPMFromMemory(const char* buffer, int width, int height, bool swap, int bps)
{
allocate (width, height);
@ -1311,6 +1481,10 @@ int ImageIO::load (const Glib::ustring &fname)
return loadPNG (fname);
} else if (hasJpegExtension(fname)) {
return loadJPEG (fname);
#ifdef LIBJXL
} else if (hasJxlExtension(fname)) {
return loadJXL(fname);
#endif
} else if (hasTiffExtension(fname)) {
return loadTIFF (fname);
} else {

View File

@ -90,6 +90,10 @@ public:
int load (const Glib::ustring &fname);
int save (const Glib::ustring &fname) const;
#ifdef LIBJXL
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);

View File

@ -90,6 +90,12 @@ void StdImageSource::getSampleFormat (const Glib::ustring &fname, IIOSampleForma
if (result == IMIO_SUCCESS) {
return;
}
#ifdef LIBJXL
} else if (hasJxlExtension(fname)) {
sFormat = IIOSF_FLOAT32;
sArrangement = IIOSA_CHUNKY;
return;
#endif
} else if (hasTiffExtension(fname)) {
int result = ImageIO::getTIFFSampleFormat (fname, sFormat, sArrangement);

View File

@ -19,6 +19,8 @@
#include <cmath>
#include <cstring>
#include <cstdio>
#include <fstream>
#include <glibmm/convert.h>
#include "rt_math.h"
#include "utils.h"
@ -222,6 +224,23 @@ void vflip(unsigned char* img, int w, int h)
}
}
std::vector<std::uint8_t> 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<std::uint8_t> contents(
(std::istreambuf_iterator<char>(instream)),
std::istreambuf_iterator<char>());
instream.close();
return contents;
} catch (...) {
return {};
}
}
Glib::ustring getFileExtension(const Glib::ustring& filename)
{
const Glib::ustring::size_type lastdot_pos = filename.find_last_of('.');
@ -237,6 +256,13 @@ bool hasJpegExtension(const Glib::ustring& filename)
return extension == "jpg" || extension == "jpeg";
}
#ifdef LIBJXL
bool hasJxlExtension(const Glib::ustring& filename)
{
return getFileExtension(filename) == "jxl";
}
#endif
bool hasTiffExtension(const Glib::ustring& filename)
{
const Glib::ustring extension = getFileExtension(filename);

View File

@ -18,6 +18,8 @@
*/
#pragma once
#include <vector>
#include <type_traits>
#include <glibmm/ustring.h>
@ -43,6 +45,8 @@ constexpr typename std::underlying_type<ENUM>::type toUnderlying(ENUM value)
return static_cast<typename std::underlying_type<ENUM>::type>(value);
}
std::vector<std::uint8_t> 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)
@ -52,6 +56,11 @@ bool hasTiffExtension(const Glib::ustring& filename);
// Return true if file has .png extension (ignoring case)
bool hasPngExtension(const Glib::ustring& filename);
#ifdef LIBJXL
// 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);
}

View File

@ -226,13 +226,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;
@ -249,64 +248,55 @@ void Thumbnail::_generateThumbnailImage ()
cfs.exifValid = false;
cfs.timeValid = false;
if (ext == "jpg" || ext == "jpeg") {
infoFromImage (fname);
tpp = rtengine::Thumbnail::loadFromImage (fname, tw, th, -1, pparams->wb.equal, pparams->wb.observer);
// 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) {
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 (!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);
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;
}
} 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;
}
cfs.format = FT_Custom;
infoFromImage(fname);
}
}
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();
}
}
@ -761,10 +751,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;
}
}
@ -798,7 +788,7 @@ rtengine::IImage8* Thumbnail::upgradeThumbImage (const rtengine::procparams::Pro
_generateThumbnailImage();
if ( tpp == nullptr ) {
if (!tpp) {
return nullptr;
}
@ -1004,7 +994,7 @@ void Thumbnail::_loadThumbnail(bool firstTrial)
_loadThumbnail (false);
}
if (tpp == nullptr) {
if (!tpp) {
return;
}
} else if (!succ) {

View File

@ -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
}

View File

@ -119,6 +119,7 @@ Source: "{#MyBuildBasePath}\options"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\*.dll"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\gspawn-win{#MyBitDepth}-helper-console.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\gdbus.exe"; DestDir: "{app}"; Flags: ignoreversion
Source: "{#MyBuildBasePath}\gdb.exe"; DestDir: "{app}"; Flags: skipifsourcedoesntexist ignoreversion
;Source: "{#MyBuildBasePath}\fonts\DroidSansMonoSlashed.ttf"; DestDir: "{fonts}"; FontInstall: "Droid Sans Mono Slashed"; Flags: onlyifdoesntexist uninsneveruninstall
; NOTE: Don't use "Flags: ignoreversion" on any shared system files