Skip to content

Commit f32f2e3

Browse files
Enabled building and testing on Windows
Fixed J2K frame detection from fragment data Fixed lossy compressiom method string
1 parent 3f1c5cc commit f32f2e3

11 files changed

Lines changed: 198 additions & 192 deletions

File tree

.github/workflows/ci.yml

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,24 @@ env:
1515
BUILD_TYPE: Release
1616

1717
jobs:
18+
build-windows:
19+
runs-on: windows-latest
20+
steps:
21+
- name: Checkout repository
22+
uses: actions/checkout@v5
23+
- name: Build on Windows
24+
shell: bash
25+
run: ./build.sh ${{env.BUILD_TYPE}}
26+
- name: Run tests on Windows
27+
shell: pwsh
28+
run: ./build/tests/${{env.BUILD_TYPE}}/dcmtkhtj2k_tests.exe
29+
- name: Archive production artifacts
30+
uses: actions/upload-artifact@v4
31+
with:
32+
name: dcmtk-htj2k-build-windows
33+
path: |
34+
build/${{env.BUILD_TYPE}}
35+
compression-level: 9
1836
build-linux:
1937
runs-on: ubuntu-latest
2038
steps:
@@ -43,7 +61,7 @@ jobs:
4361
- name: Archive production artifacts
4462
uses: actions/upload-artifact@v4
4563
with:
46-
name: dcmtk-htj2k-build-osx
64+
name: dcmtk-htj2k-build-macos
4765
path: |
4866
build/${{env.BUILD_TYPE}}
4967
compression-level: 9

CMakeLists.txt

Lines changed: 69 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -1,134 +1,123 @@
11
cmake_minimum_required(VERSION 3.12.0)
22

3-
project(DCMTKHTJ2K)
4-
5-
set (DCMTKHTJ2K_VERSION_MAJOR 1)
6-
set (DCMTKHTJ2K_VERSION_MINOR 0)
7-
set (DCMTKHTJ2K_VERSION_BUILD 0)
8-
set(DCMTKHTJ2K_VERSION "${DCMTKHTJ2K_VERSION_MAJOR}.${DCMTKHTJ2K_VERSION_MINOR}.${DCMTKHTJ2K_VERSION_BUILD}")
3+
project(
4+
DCMTKHTJ2K
5+
DESCRIPTION
6+
"High-throughput JPEG2000 (HTJ2K) codec for DCMTK using OpenJPH"
7+
LANGUAGES CXX)
8+
9+
set(DCMTKHTJ2K_VERSION_MAJOR 1)
10+
set(DCMTKHTJ2K_VERSION_MINOR 0)
11+
set(DCMTKHTJ2K_VERSION_BUILD 1)
12+
set(DCMTKHTJ2K_VERSION
13+
"${DCMTKHTJ2K_VERSION_MAJOR}.${DCMTKHTJ2K_VERSION_MINOR}.${DCMTKHTJ2K_VERSION_BUILD}"
14+
)
915

1016
option(BUILD_SHARED_LIBS "Build DCMTKHTJ2K shared library" ON)
1117

12-
set (CMAKE_CXX_STANDARD 11)
18+
set(CMAKE_CXX_STANDARD 11)
1319

1420
find_package(DCMTK REQUIRED)
1521
find_package(OPENJPH REQUIRED)
1622

17-
INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/include ${DCMTK_INCLUDE_DIRS} ${OPENJPH_INCLUDE_DIRS})
18-
LINK_DIRECTORIES(${DCMTKHTJ2K}/lib)
23+
include_directories(${CMAKE_SOURCE_DIR}/include ${DCMTK_INCLUDE_DIRS}
24+
${OPENJPH_INCLUDE_DIRS})
25+
link_directories(${DCMTKHTJ2K}/lib)
1926

2027
add_definitions(-DDCMTKHTJ2K_EXPORTS)
2128

2229
set(DCMTKHTJ2K_HEADERS
23-
include/dcmtkhtj2k/djcodecd.h
24-
include/dcmtkhtj2k/djcodece.h
25-
include/dcmtkhtj2k/djcparam.h
26-
include/dcmtkhtj2k/djdecode.h
27-
include/dcmtkhtj2k/djencode.h
28-
include/dcmtkhtj2k/djutils.h
29-
include/dcmtkhtj2k/djrparam.h
30-
include/dcmtkhtj2k/dldefine.h
31-
)
30+
include/dcmtkhtj2k/djcodecd.h
31+
include/dcmtkhtj2k/djcodece.h
32+
include/dcmtkhtj2k/djcparam.h
33+
include/dcmtkhtj2k/djdecode.h
34+
include/dcmtkhtj2k/djencode.h
35+
include/dcmtkhtj2k/djutils.h
36+
include/dcmtkhtj2k/djrparam.h
37+
include/dcmtkhtj2k/dldefine.h)
3238

3339
set(DCMTKHTJ2K_SRCS
3440
${DCMTKHTJ2K_HEADERS}
35-
libsrc/djcodecd.cc
36-
libsrc/djcodece.cc
37-
libsrc/djcparam.cc
38-
libsrc/djdecode.cc
39-
libsrc/djencode.cc
40-
libsrc/djrparam.cc
41-
libsrc/djutils.cc
42-
)
43-
44-
if (MSVC)
45-
add_compile_options(/Zc:__cplusplus)
41+
libsrc/djcodecd.cc
42+
libsrc/djcodece.cc
43+
libsrc/djcparam.cc
44+
libsrc/djdecode.cc
45+
libsrc/djencode.cc
46+
libsrc/djrparam.cc
47+
libsrc/djutils.cc)
48+
49+
if(MSVC)
50+
add_compile_options(/Zc:__cplusplus)
4651
endif()
4752
if(WIN32)
48-
add_definitions(-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
53+
add_definitions(-D_BIND_TO_CURRENT_VCLIBS_VERSION=1)
4954
endif()
5055

5156
add_library(DCMTKHTJ2K ${DCMTKHTJ2K_SRCS})
5257
set(DCMTKHTJ2K_LIBRARY_NAME DCMTKHTJ2K)
53-
TARGET_LINK_LIBRARIES(DCMTKHTJ2K
54-
DCMTK::DCMTK
55-
openjph
56-
)
58+
target_link_libraries(DCMTKHTJ2K DCMTK::DCMTK openjph)
5759

5860
include(GenerateExportHeader)
5961
generate_export_header(DCMTKHTJ2K)
6062
set_property(TARGET DCMTKHTJ2K PROPERTY VERSION ${DCMTKHTJ2K_VERSION})
6163
set_property(TARGET DCMTKHTJ2K PROPERTY SOVERSION 1)
62-
set_property(TARGET DCMTKHTJ2K PROPERTY
63-
INTERFACE_DCMTKHTJ2K_MAJOR_VERSION 1)
64-
set_property(TARGET DCMTKHTJ2K APPEND PROPERTY
65-
COMPATIBLE_INTERFACE_STRING DCMTKHTJ2K_MAJOR_VERSION
66-
)
64+
set_property(TARGET DCMTKHTJ2K PROPERTY INTERFACE_DCMTKHTJ2K_MAJOR_VERSION 1)
65+
set_property(
66+
TARGET DCMTKHTJ2K
67+
APPEND
68+
PROPERTY COMPATIBLE_INTERFACE_STRING DCMTKHTJ2K_MAJOR_VERSION)
6769

68-
install(TARGETS DCMTKHTJ2K EXPORT DCMTKHTJ2KTargets
70+
install(
71+
TARGETS DCMTKHTJ2K
72+
EXPORT DCMTKHTJ2KTargets
6973
LIBRARY DESTINATION lib
7074
ARCHIVE DESTINATION lib
71-
RUNTIME DESTINATION bin
72-
)
75+
RUNTIME DESTINATION bin)
7376

7477
install(
75-
FILES
76-
${DCMTKHTJ2K_HEADERS}
77-
DESTINATION
78-
include/DCMTKHTJ2K
79-
COMPONENT
80-
Devel
81-
)
78+
FILES ${DCMTKHTJ2K_HEADERS}
79+
DESTINATION include/DCMTKHTJ2K
80+
COMPONENT Devel)
8281

8382
include(CMakePackageConfigHelpers)
8483
write_basic_package_version_file(
8584
"${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfigVersion.cmake"
8685
VERSION ${DCMTKHTJ2K_VERSION}
87-
COMPATIBILITY AnyNewerVersion
88-
)
86+
COMPATIBILITY AnyNewerVersion)
8987

9088
export(TARGETS DCMTKHTJ2K
91-
FILE "${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KExports.cmake"
92-
)
93-
configure_file( ${CMAKE_SOURCE_DIR}/cmake/DCMTKHTJ2KConfig.cmake.in
94-
${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfig.cmake
95-
@ONLY
96-
)
89+
FILE "${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KExports.cmake")
90+
configure_file(${CMAKE_SOURCE_DIR}/cmake/DCMTKHTJ2KConfig.cmake.in
91+
${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfig.cmake @ONLY)
9792

9893
set(ConfigPackageLocation lib/cmake/DCMTKHTJ2K)
99-
install(EXPORT DCMTKHTJ2KTargets
100-
FILE
101-
DCMTKHTJ2KTargets.cmake
102-
DESTINATION
103-
${ConfigPackageLocation}
104-
)
94+
install(
95+
EXPORT DCMTKHTJ2KTargets
96+
FILE DCMTKHTJ2KTargets.cmake
97+
DESTINATION ${ConfigPackageLocation})
10598

10699
install(
107-
FILES
108-
"${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfig.cmake"
109-
"${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfigVersion.cmake"
110-
DESTINATION
111-
${ConfigPackageLocation}
112-
COMPONENT
113-
Devel
114-
)
100+
FILES "${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfig.cmake"
101+
"${CMAKE_CURRENT_BINARY_DIR}/DCMTKHTJ2KConfigVersion.cmake"
102+
DESTINATION ${ConfigPackageLocation}
103+
COMPONENT Devel)
115104

116105
option(BUILD_TESTING "Build the testing tree" ON)
117106
if(BUILD_TESTING)
118107
enable_testing()
119-
120-
# Fetch Google Test
108+
121109
include(FetchContent)
110+
122111
FetchContent_Declare(
123112
googletest
124113
GIT_REPOSITORY https://github.com/google/googletest.git
125-
GIT_TAG v1.14.0
126-
)
127-
128-
# For Windows: Prevent overriding the parent project's compiler/linker settings
129-
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
130-
114+
GIT_TAG v1.14.0)
115+
116+
set(gtest_force_shared_crt
117+
OFF
118+
CACHE BOOL "" FORCE)
119+
131120
FetchContent_MakeAvailable(googletest)
132-
121+
133122
add_subdirectory(tests)
134123
endif()

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ DCMTK-HTJ2K provides HTJ2K codec support for [DCMTK](https://github.com/DCMTK/dc
1818
- **HTJ2K Decoding**: Decompress HTJ2K-encoded DICOM images.
1919
- **DCMTK Integration**: Seamless integration with DCMTK codec framework.
2020
- **Configurable Parameters**: Support for codeblock dimensions, progression order, number of decompositions, fragment sizes, and encoding options.
21+
- **Cross Platform**: Supports Linux, macOS, and Windows builds.
2122

2223
## Dependencies
2324

build.sh

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
#!/bin/bash
22
set -xe
33

4-
if [ "$1" == "Debug" ]
5-
then
6-
BUILD_TYPE=Debug
4+
if [ "$1" == "Debug" ]; then
5+
BUILD_TYPE=Debug
76
else
8-
BUILD_TYPE=Release
7+
BUILD_TYPE=Release
98
fi
109

1110
BUILD_DIR="$(pwd)/build"
@@ -14,28 +13,30 @@ OTS_DEV_SPACE="$(pwd)/ots"
1413

1514
mkdir -p $OTS_DEV_SPACE
1615
cd $OTS_DEV_SPACE
17-
[[ -d dcmtk ]] || git clone https://github.com/DCMTK/dcmtk.git
16+
[[ -d dcmtk ]] || git clone https://github.com/DCMTK/dcmtk.git
1817
cd dcmtk
1918
git fetch
2019
git checkout -f DCMTK-3.6.9
2120
mkdir -p $BUILD_TYPE
2221
cd $BUILD_TYPE
2322
cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
24-
-DCMAKE_CXX_STANDARD=11 \
25-
-DDCMTK_MODULES='ofstd;oficonv;oflog;dcmdata;dcmimgle;dcmimage;dcmjpeg;dcmjpls' \
26-
-DDCMTK_ENABLE_STL=OFF \
27-
-DDCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS=OFF \
28-
-DDCMTK_DEFAULT_DICT='builtin' \
29-
-DDCMTK_WITH_TIFF=OFF \
30-
-DDCMTK_WITH_PNG=OFF \
31-
-DDCMTK_WITH_OPENSSL=OFF \
32-
-DDCMTK_WITH_XML=OFF \
33-
-DDCMTK_WITH_ZLIB=OFF \
34-
-DDCMTK_WITH_SNDFILE=OFF \
35-
-DDCMTK_WITH_ICONV=ON \
36-
-DDCMTK_WITH_WRAP=OFF \
37-
-DBUILD_APPS=OFF \
38-
-DCMAKE_INSTALL_PREFIX=$OTS_DEV_SPACE/dcmtk/$BUILD_TYPE
23+
-DCMAKE_CXX_STANDARD=11 \
24+
-DDCMTK_MODULES='ofstd;oficonv;oflog;dcmdata;dcmimgle;dcmimage;dcmjpeg;dcmjpls' \
25+
-DDCMTK_ENABLE_STL=OFF \
26+
-DDCMTK_WIDE_CHAR_FILE_IO_FUNCTIONS=OFF \
27+
-DDCMTK_DEFAULT_DICT='builtin' \
28+
-DDCMTK_WITH_TIFF=OFF \
29+
-DDCMTK_WITH_PNG=OFF \
30+
-DDCMTK_WITH_OPENSSL=OFF \
31+
-DDCMTK_WITH_XML=OFF \
32+
-DDCMTK_WITH_ZLIB=OFF \
33+
-DDCMTK_WITH_SNDFILE=OFF \
34+
-DDCMTK_WITH_ICONV=ON \
35+
-DDCMTK_WITH_WRAP=OFF \
36+
-DBUILD_APPS=OFF \
37+
-DCMAKE_INSTALL_PREFIX=$OTS_DEV_SPACE/dcmtk/$BUILD_TYPE \
38+
-DCMAKE_POLICY_DEFAULT_CMP0091=NEW \
39+
-DCMAKE_MSVC_RUNTIME_LIBRARY='MultiThreaded$<$<CONFIG:Debug>:Debug>'
3940
cmake --build . --parallel $(nproc) --config $BUILD_TYPE
4041
cmake --install . --config $BUILD_TYPE
4142

@@ -47,22 +48,27 @@ git checkout -f 0.26.0
4748
mkdir -p $BUILD_TYPE
4849
cd $BUILD_TYPE
4950
cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
50-
-DCMAKE_CXX_STANDARD=11 \
51-
-DBUILD_SHARED_LIBS=OFF \
52-
-DOJPH_BUILD_EXECUTABLES=OFF \
53-
-DCMAKE_INSTALL_PREFIX=$OTS_DEV_SPACE/openjph/$BUILD_TYPE
51+
-DCMAKE_CXX_STANDARD=11 \
52+
-DBUILD_SHARED_LIBS=OFF \
53+
-DOJPH_BUILD_EXECUTABLES=OFF \
54+
-DCMAKE_INSTALL_PREFIX=$OTS_DEV_SPACE/openjph/$BUILD_TYPE \
55+
-DCMAKE_POLICY_DEFAULT_CMP0091=NEW \
56+
-DCMAKE_MSVC_RUNTIME_LIBRARY='MultiThreaded$<$<CONFIG:Debug>:Debug>'
5457
cmake --build . --parallel $(nproc) --config $BUILD_TYPE
5558
cmake --install . --config $BUILD_TYPE
5659

5760
mkdir -p $BUILD_DIR
5861
mkdir -p $BUILD_DIR_LIB
5962
cd $BUILD_DIR
6063
cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE \
61-
-DCMAKE_CXX_STANDARD=11 \
62-
-DBUILD_SHARED_LIBS=OFF \
63-
-DDCMTK_ROOT=$OTS_DEV_SPACE/dcmtk/$BUILD_TYPE \
64-
-DOPENJPH_DIR=$OTS_DEV_SPACE/openjph/$BUILD_TYPE/lib/cmake/openjph \
65-
-DDCMTKHTJ2K_ROOT=$OTS_DEV_SPACE/dcmtkhtj2k/$BUILD_TYPE \
66-
-DCMAKE_INSTALL_PREFIX=$BUILD_DIR_LIB
64+
-DCMAKE_CXX_STANDARD=11 \
65+
-DBUILD_SHARED_LIBS=OFF \
66+
-DBUILD_TESTING=ON \
67+
-DDCMTK_ROOT=$OTS_DEV_SPACE/dcmtk/$BUILD_TYPE \
68+
-DOPENJPH_DIR=$OTS_DEV_SPACE/openjph/$BUILD_TYPE/lib/cmake/openjph \
69+
-DDCMTKHTJ2K_ROOT=$OTS_DEV_SPACE/dcmtkhtj2k/$BUILD_TYPE \
70+
-DCMAKE_INSTALL_PREFIX=$BUILD_DIR_LIB \
71+
-DCMAKE_POLICY_DEFAULT_CMP0091=NEW \
72+
-DCMAKE_MSVC_RUNTIME_LIBRARY='MultiThreaded$<$<CONFIG:Debug>:Debug>'
6773
cmake --build . --parallel $(nproc) --config $BUILD_TYPE
6874
cmake --install . --config $BUILD_TYPE

include/dcmtkhtj2k/djcodecd.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -288,7 +288,7 @@ class DCMTKHTJ2K_EXPORT HtJ2kDecoderBase : public DcmCodec {
288288
* this fragment is the start of a new HT-J2K image, i.e. starts with
289289
* an SOI marker followed by SOF, COM or APPn.
290290
*/
291-
static OFBool isJPEGLSStartOfImage(Uint8 *fragmentData);
291+
static OFBool isJ2KStartOfImage(Uint8 *fragmentData);
292292

293293
/** converts an RGB or YBR frame with 8 bits/sample from
294294
* color-by-pixel to color-by-plane planar configuration.

include/dcmtkhtj2k/djcparam.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ class DCMTKHTJ2K_EXPORT HtJ2kCodecParameter : public DcmCodecParameter {
6363
virtual ~HtJ2kCodecParameter();
6464

6565
/** this methods creates a copy of type DcmCodecParameter *
66-
* it must be overweritten in every subclass.
66+
* it must be overwritten in every subclass.
6767
* @return copy of this object
6868
*/
6969
virtual DcmCodecParameter *clone() const;

include/dcmtkhtj2k/djdecode.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33

44
#include "dcmtk/config/osconfig.h"
55
#include "dcmtk/ofstd/oftypes.h" /* for OFBool */
6-
#include "djutils.h" /* for enums */
6+
#include "djutils.h" /* for enums */
77

88
class HtJ2kCodecParameter;
99
class HtJ2kDecoder;

0 commit comments

Comments
 (0)