From 11f210701eaff262ebb20868c1833321a38bf225 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Deuc=D0=B5?= <shurd@sasktel.net>
Date: Sat, 28 Dec 2024 19:17:57 -0500
Subject: [PATCH] Do parallel JPEG XL decoding

With this, my fancy intro is quite usable...
---
 src/syncterm/CMakeLists.txt |  9 +++++++++
 src/syncterm/term.c         | 11 +++++++++++
 2 files changed, 20 insertions(+)

diff --git a/src/syncterm/CMakeLists.txt b/src/syncterm/CMakeLists.txt
index 9c812c5561..a90304984b 100644
--- a/src/syncterm/CMakeLists.txt
+++ b/src/syncterm/CMakeLists.txt
@@ -30,6 +30,7 @@ INCLUDE (CheckIncludeFiles)
 find_package(PkgConfig)
 if(NOT WITHOUT_JPEG_XL)
 	pkg_check_modules(JPEG_XL libjxl)
+	pkg_check_modules(JPEG_XL_THREADS libjxl_threads)
 endif()
 
 set(SOURCE
@@ -138,6 +139,14 @@ if(NOT WITHOUT_JPEG_XL)
 		target_link_directories(syncterm PRIVATE ${JPEG_XL_LIBRARY_DIRS})
 		target_link_libraries(syncterm ${JPEG_XL_LIBRARIES})
 		target_link_options(syncterm PRIVATE ${JPEG_XL_LDFLAGS})
+		if(JPEG_XL_THREADS_FOUND)
+			target_compile_definitions(syncterm PUBLIC WITH_JPEG_XL_THREADS)
+			target_include_directories(syncterm PRIVATE ${JPEG_XL_THREADS_INCLUDE_DIRS})
+			target_compile_options(syncterm PRIVATE ${JPEG_XL_THREADS_CFLAGS})
+			target_link_directories(syncterm PRIVATE ${JPEG_XL_THREADS_LIBRARY_DIRS})
+			target_link_libraries(syncterm ${JPEG_XL_THREADS_LIBRARIES})
+			target_link_options(syncterm PRIVATE ${JPEG_XL_THREADS_LDFLAGS})
+		endif()
 	endif()
 endif()
 
diff --git a/src/syncterm/term.c b/src/syncterm/term.c
index 5bf2f92853..7189a7b5f4 100644
--- a/src/syncterm/term.c
+++ b/src/syncterm/term.c
@@ -46,6 +46,7 @@
 #ifdef WITH_JPEG_XL
 #include <jxl/decode.h>
 #include <jxl/encode.h>
+#include <jxl/resizable_parallel_runner.h>
 #include "xpmap.h"
 #endif
 
@@ -3112,6 +3113,13 @@ read_jxl(const char *fn)
 		xpunmap(map);
 		return NULL;
 	}
+	void *rpr = JxlResizableParallelRunnerCreate(NULL);
+	if (rpr) {
+		if (JxlDecoderSetParallelRunner(dec, JxlResizableParallelRunner, rpr) != JXL_DEC_SUCCESS) {
+			JxlResizableParallelRunnerDestroy(rpr);
+			rpr = NULL;
+		}
+	}
 	if (JxlDecoderSetInput(dec, map->addr, map->size) != JXL_DEC_SUCCESS) {
 		xpunmap(map);
 		JxlDecoderDestroy(dec);
@@ -3136,6 +3144,7 @@ read_jxl(const char *fn)
 				}
 				width = info.xsize;
 				height = info.ysize;
+				JxlResizableParallelRunnerSetThreads(rpr, JxlResizableParallelRunnerSuggestThreads(info.xsize, info.ysize));
 				break;
 			case JXL_DEC_COLOR_ENCODING:
 				// TODO...
@@ -3187,6 +3196,8 @@ read_jxl(const char *fn)
 		}
 	}
 	free(pbuf);
+	if (rpr)
+		JxlResizableParallelRunnerDestroy(rpr);
 	JxlDecoderReleaseInput(dec);
 	xpunmap(map);
 	JxlDecoderDestroy(dec);
-- 
GitLab