Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
d25d71d
feat: Add GPU-accelerated TIFF decoding via nvImageCodec v0.6.0
cdinea Dec 3, 2025
e5248df
refactor: Remove unnecessary CUDA_INCLUDE_PATH from run script
cdinea Dec 3, 2025
2f2f1e0
build: Add libnvimgcodec metapackage to capture run_exports
cdinea Dec 3, 2025
9c698d1
refactor: Use cucim.__version__ instead of reading VERSION file
cdinea Dec 3, 2025
184a11a
refactor: Use cucim.__version__ in test_philips_tiff.py
cdinea Dec 3, 2025
417c715
build: Bump minimum CuPy version to 14.0.0
cdinea Dec 3, 2025
c550305
refactor: Remove AUTO_INSTALL_NVIMGCODEC feature
cdinea Dec 3, 2025
785efe2
build: Update pyproject.toml for CuPy 14.0.0
cdinea Dec 3, 2025
d85de65
refactor: Use const string_views for spacing units
cdinea Dec 3, 2025
5eb6a1d
Update cpp/plugins/cucim.kit.cuslide2/src/cuslide/nvimgcodec/nvimgcod…
cdinea Dec 3, 2025
76dd669
refactor: Use reference to pointer for output_buffer parameter
cdinea Dec 3, 2025
539f33f
test: Remove assertionn
cdinea Dec 4, 2025
214d6fb
style: Update copyright header to SPDX format in test_philips_tiff.cpp
cdinea Dec 4, 2025
e3f25b2
build: Remove redundant libnvimgcodec0 dependency.
cdinea Dec 4, 2025
0285c3b
style: Add braces to single-line if statements in TIFF parser.
cdinea Dec 4, 2025
228864e
refactor: Remove unused tile-based decoding methods
cdinea Dec 4, 2025
e9b22e0
Revert "build: Update pyproject.toml for CuPy 14.0.0"
cdinea Dec 4, 2025
ffdabfa
Revert "build: Bump minimum CuPy version to 14.0.0"
cdinea Dec 4, 2025
d85c839
Revert "refactor: Remove unnecessary CUDA_INCLUDE_PATH from run script"
cdinea Dec 4, 2025
3dc14fe
chore: Remove local environment-specific entries from .gitignore
cdinea Dec 4, 2025
60874fe
test: Rename cuslide_tests to cuslide2_tests and enable tests
cdinea Dec 4, 2025
73332f9
Rename cuslide_benchmarks to cuslide2_benchmarks for consistency
cdinea Dec 4, 2025
b8ae2dd
Fix pre-commit formatting: remove trailing whitespace
cdinea Dec 4, 2025
4360b5c
Remove nvimgcodec_manager.h from CMakeLists.txt (file was removed in …
cdinea Dec 4, 2025
be1eb77
refactor: Remove unused codec library dependencies
cdinea Dec 4, 2025
798d326
style: Remove redundant license line from config.h header
cdinea Dec 4, 2025
085cb46
Update cpp/plugins/cucim.kit.cuslide2/tests/main.cpp
cdinea Dec 4, 2025
2a8c0b7
Update cpp/plugins/cucim.kit.cuslide2/benchmarks/main.cpp
cdinea Dec 4, 2025
5124f91
refactor: Remove incorrectly named config.cmake.in file
cdinea Dec 4, 2025
6d84512
Update cpp/plugins/cucim.kit.cuslide2/src/cuslide/cuslide.h
cdinea Dec 4, 2025
053238d
Update cpp/plugins/cucim.kit.cuslide2/tests/config.h
cdinea Dec 4, 2025
6d2767d
Update cpp/plugins/cucim.kit.cuslide2/tests/test_read_region.cpp
cdinea Dec 4, 2025
2f22839
style: Clean up main.cpp files for cuslide2egration.
cdinea Dec 4, 2025
75515df
style: Add cuslide2-specific comments to cuslide.h.
cdinea Dec 4, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -155,3 +155,5 @@ conda-bld

# Custom debug environment setup script for VS Code (used by scripts/debug_python)
/scripts/debug_env.sh
*.tiff
junit-cucim.xml
3 changes: 2 additions & 1 deletion conda/recipes/libcucim/meta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ build:
- cuda-cudart-dev
- libcufile-dev
- libnvjpeg-dev
- libnvimgcodec-dev
script_env:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
Expand Down Expand Up @@ -70,7 +71,7 @@ requirements:
- libcufile
- cuda-cudart
- libnvjpeg
- libnvimgcodec0 {{ nvimgcodec_version }} # nvImageCodec runtime library
- libnvimgcodec {{ nvimgcodec_version }} # nvImageCodec metapackage (includes libnvimgcodec0 + run_exports)
run_constrained:
- {{ pin_compatible('openslide') }}
- libnvimgcodec-dev {{ nvimgcodec_version }} # Optional: for development/debugging
Expand Down
113 changes: 113 additions & 0 deletions cpp/cmake/deps/nvimgcodec.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
#
# cmake-format: off
# SPDX-FileCopyrightText: Copyright (c) 2020-2025, NVIDIA CORPORATION.
# SPDX-License-Identifier: Apache-2.0
# cmake-format: on
#

if (NOT TARGET deps::nvimgcodec)
# First try to find it as a package
find_package(nvimgcodec QUIET)

if(nvimgcodec_FOUND)
# Use the found package
add_library(deps::nvimgcodec INTERFACE IMPORTED GLOBAL)
target_link_libraries(deps::nvimgcodec INTERFACE nvimgcodec::nvimgcodec)
message(STATUS "✓ nvImageCodec found via find_package")
else()
# Manual detection in various environments
set(NVIMGCODEC_LIB_PATH "")
set(NVIMGCODEC_INCLUDE_PATH "")

# Try conda environment detection (both Python packages and native packages)
if(DEFINED ENV{CONDA_BUILD})
# Conda build environment
set(NVIMGCODEC_LIB_PATH "$ENV{PREFIX}/lib/libnvimgcodec.so.0")
set(NVIMGCODEC_INCLUDE_PATH "$ENV{PREFIX}/include/")
if(NOT EXISTS "${NVIMGCODEC_LIB_PATH}")
set(NVIMGCODEC_LIB_PATH "$ENV{PREFIX}/lib/libnvimgcodec.so")
endif()
elseif(DEFINED ENV{CONDA_PREFIX})
# Active conda environment - try native package first
set(CONDA_NATIVE_ROOT "$ENV{CONDA_PREFIX}")
if(EXISTS "${CONDA_NATIVE_ROOT}/include/nvimgcodec.h")
set(NVIMGCODEC_INCLUDE_PATH "${CONDA_NATIVE_ROOT}/include/")
if(EXISTS "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so.0")
set(NVIMGCODEC_LIB_PATH "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so.0")
elseif(EXISTS "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so")
set(NVIMGCODEC_LIB_PATH "${CONDA_NATIVE_ROOT}/lib/libnvimgcodec.so")
endif()
else()
# Fallback: try Python site-packages in conda environment
foreach(PY_VER "3.13" "3.12" "3.11" "3.10" "3.9")
set(CONDA_PYTHON_ROOT "$ENV{CONDA_PREFIX}/lib/python${PY_VER}/site-packages/nvidia/nvimgcodec")
if(EXISTS "${CONDA_PYTHON_ROOT}/include/nvimgcodec.h")
set(NVIMGCODEC_INCLUDE_PATH "${CONDA_PYTHON_ROOT}/include/")
if(EXISTS "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
set(NVIMGCODEC_LIB_PATH "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
elseif(EXISTS "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so")
set(NVIMGCODEC_LIB_PATH "${CONDA_PYTHON_ROOT}/lib/libnvimgcodec.so")
endif()
break()
endif()
endforeach()
endif()
else()
# Try Python site-packages detection
find_package(Python3 COMPONENTS Interpreter)
if(Python3_FOUND)
execute_process(
COMMAND ${Python3_EXECUTABLE} -c "import site; print(site.getsitepackages()[0])"
OUTPUT_VARIABLE PYTHON_SITE_PACKAGES
OUTPUT_STRIP_TRAILING_WHITESPACE
ERROR_QUIET
)

if(PYTHON_SITE_PACKAGES)
set(NVIMGCODEC_PYTHON_ROOT "${PYTHON_SITE_PACKAGES}/nvidia/nvimgcodec")
if(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/include/nvimgcodec.h")
set(NVIMGCODEC_INCLUDE_PATH "${NVIMGCODEC_PYTHON_ROOT}/include/")
if(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
set(NVIMGCODEC_LIB_PATH "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so.0")
elseif(EXISTS "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so")
set(NVIMGCODEC_LIB_PATH "${NVIMGCODEC_PYTHON_ROOT}/lib/libnvimgcodec.so")
endif()
endif()
endif()
endif()

# System-wide installation fallback
if(NOT NVIMGCODEC_LIB_PATH)
if(EXISTS /usr/lib/x86_64-linux-gnu/libnvimgcodec.so.0)
set(NVIMGCODEC_LIB_PATH /usr/lib/x86_64-linux-gnu/libnvimgcodec.so.0)
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
elseif(EXISTS /usr/lib/aarch64-linux-gnu/libnvimgcodec.so.0)
set(NVIMGCODEC_LIB_PATH /usr/lib/aarch64-linux-gnu/libnvimgcodec.so.0)
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
elseif(EXISTS /usr/lib64/libnvimgcodec.so.0) # CentOS (x86_64)
set(NVIMGCODEC_LIB_PATH /usr/lib64/libnvimgcodec.so.0)
set(NVIMGCODEC_INCLUDE_PATH "/usr/include/")
endif()
endif()
endif()

# Create the target if we found the library
if(NVIMGCODEC_LIB_PATH AND EXISTS "${NVIMGCODEC_LIB_PATH}")
add_library(deps::nvimgcodec SHARED IMPORTED GLOBAL)
set_target_properties(deps::nvimgcodec PROPERTIES
IMPORTED_LOCATION "${NVIMGCODEC_LIB_PATH}"
INTERFACE_INCLUDE_DIRECTORIES "${NVIMGCODEC_INCLUDE_PATH}"
)
message(STATUS "✓ nvImageCodec found:")
message(STATUS " Library: ${NVIMGCODEC_LIB_PATH}")
message(STATUS " Headers: ${NVIMGCODEC_INCLUDE_PATH}")
else()
# Create a dummy target to prevent build failures
add_library(deps::nvimgcodec INTERFACE IMPORTED GLOBAL)
message(STATUS "✗ nvImageCodec not found - GPU acceleration disabled")
message(STATUS "To enable nvImageCodec support:")
message(STATUS " Option 1 (conda): conda install libnvimgcodec-dev -c conda-forge")
message(STATUS " Option 2 (pip): pip install nvidia-nvimgcodec-cu12[all]")
endif()
endif()
endif()
86 changes: 86 additions & 0 deletions cpp/plugins/cucim.kit.cuslide2/.clang-format
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
AccessModifierOffset: -4
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false
AlignTrailingComments: false
AllowAllParametersOfDeclarationOnNextLine: true
AllowShortFunctionsOnASingleLine: false
AllowShortIfStatementsOnASingleLine: false
AllowShortCaseLabelsOnASingleLine : false
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterDefinitionReturnType: false
AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: true
BinPackArguments: true
BinPackParameters: false
BreakBeforeBinaryOperators: false
BreakBeforeBraces: Custom
BraceWrapping:
AfterClass: true
AfterControlStatement: true
AfterEnum: true
AfterFunction: true
AfterNamespace: true
AfterObjCDeclaration: true
AfterStruct: true
AfterUnion: true
AfterExternBlock: true
BeforeCatch: true
BeforeElse: true
IndentBraces: false
SplitEmptyFunction: true
SplitEmptyRecord: true
SplitEmptyNamespace : true
BreakBeforeTernaryOperators: false
BreakConstructorInitializersBeforeComma: false
BreakStringLiterals: false
ColumnLimit: 120
CommentPragmas: ''
ConstructorInitializerAllOnOneLineOrOnePerLine: true
ConstructorInitializerIndentWidth: 4
ContinuationIndentWidth: 4
Cpp11BracedListStyle: false
DerivePointerBinding: false
FixNamespaceComments: true
IndentCaseLabels: false
IndentPPDirectives: AfterHash
IndentFunctionDeclarationAfterType: false
IndentWidth: 4
SortIncludes: false
IncludeCategories:
- Regex: '[<"](.*\/)?Defines.h[>"]'
Priority: 1
# - Regex: '<cuslide\/.+>'
# Priority: 3
- Regex: '<[[:alnum:]_.]+>'
Priority: 5
- Regex: '<[[:alnum:]_.\/]+>'
Priority: 4
- Regex: '".*"'
Priority: 2
IncludeBlocks: Regroup
Language: Cpp
MaxEmptyLinesToKeep: 2
NamespaceIndentation: None
ObjCSpaceAfterProperty: true
ObjCSpaceBeforeProtocolList: true
PenaltyBreakBeforeFirstCallParameter: 0
PenaltyBreakComment: 1
PenaltyBreakFirstLessLess: 0
PenaltyBreakString: 1
PenaltyExcessCharacter: 10
PenaltyReturnTypeOnItsOwnLine: 1000
PointerAlignment: Left
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInContainerLiterals: false
SpacesInParentheses: false
Standard: Cpp11
ReflowComments: true
TabWidth: 4
UseTab: Never
7 changes: 7 additions & 0 deletions cpp/plugins/cucim.kit.cuslide2/.editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[*]
indent_style = space
indent_size = 4
charset = utf-8
trim_trailing_whitespace = true
max_line_length = 120
insert_final_newline = true
2 changes: 2 additions & 0 deletions cpp/plugins/cucim.kit.cuslide2/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
cmake-build*
install
Loading