Skip to content

Commit

Permalink
Merge pull request #50 from smoked-herring/feature/check-tiff-compres…
Browse files Browse the repository at this point in the history
…sions

Feature/check tiff compressions [closes #49]
  • Loading branch information
Dmitry Baryshev authored Jan 15, 2021
2 parents d73545a + 69f9a1c commit 6250cce
Show file tree
Hide file tree
Showing 5 changed files with 249 additions and 45 deletions.
8 changes: 8 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ project(SAIL VERSION 0.9.0
include(GNUInstallDirs)
include(CheckIncludeFiles)
include(CheckCSourceCompiles)
include(CheckCSourceRuns)
include(CMakeDependentOption)
include(CMakePushCheckState)

Expand Down Expand Up @@ -94,6 +95,13 @@ set(SAIL_MAGIC_BUFFER_SIZE 16)
#
if (WIN32 AND NOT SAIL_VCPKG)
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${PROJECT_SOURCE_DIR}/extra/B)

# For check_c_source_runs() we need to update PATH
# so checks are able to find bundled libs
#
set(EXTRA_LIBS "${PROJECT_SOURCE_DIR}/extra/B/bin")
string(REPLACE "/" "\\" EXTRA_LIBS "${EXTRA_LIBS}")
set(ENV{PATH} "$ENV{PATH};${EXTRA_LIBS}")
endif()

# Enable strict C11
Expand Down
12 changes: 6 additions & 6 deletions cmake/sail_codec.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,6 @@ macro(sail_codec)
#
set(TARGET sail-codec-${SAIL_CODEC_NAME})

# Generate and copy .codec.info into the build dir
#
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SAIL_CODEC_NAME}.codec.info.in
${CMAKE_CURRENT_BINARY_DIR}/sail-codec-${SAIL_CODEC_NAME}.codec.info
@ONLY)

# Add a codec
#
if (SAIL_COMBINE_CODECS)
Expand Down Expand Up @@ -103,6 +97,12 @@ macro(sail_codec)
target_include_directories(${TARGET} PRIVATE ${sail_${SAIL_CODEC_NAME}_include_dirs})
target_link_libraries(${TARGET} PRIVATE ${sail_${SAIL_CODEC_NAME}_libs})

# Generate and copy .codec.info into the build dir
#
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/${SAIL_CODEC_NAME}.codec.info.in
${CMAKE_CURRENT_BINARY_DIR}/sail-codec-${SAIL_CODEC_NAME}.codec.info
@ONLY)

# Installation
#
if (NOT SAIL_COMBINE_CODECS)
Expand Down
159 changes: 145 additions & 14 deletions src/sail-codecs/tiff/helpers.c
Original file line number Diff line number Diff line change
Expand Up @@ -78,40 +78,94 @@ sail_status_t tiff_private_supported_read_output_pixel_format(enum SailPixelForm
enum SailCompression tiff_private_compression_to_sail_compression(int compression) {

switch (compression) {
#ifdef HAVE_TIFF_ADOBE_DEFLATE
case COMPRESSION_ADOBE_DEFLATE: return SAIL_COMPRESSION_ADOBE_DEFLATE;
#endif
#ifdef HAVE_TIFF_CCITTRLE
case COMPRESSION_CCITTRLE: return SAIL_COMPRESSION_CCITT_RLE;
#endif
#ifdef HAVE_TIFF_CCITTRLEW
case COMPRESSION_CCITTRLEW: return SAIL_COMPRESSION_CCITT_RLEW;
#endif
#ifdef HAVE_TIFF_CCITT_T4
case COMPRESSION_CCITT_T4: return SAIL_COMPRESSION_CCITT_T4;
#endif
#ifdef HAVE_TIFF_CCITT_T6
case COMPRESSION_CCITT_T6: return SAIL_COMPRESSION_CCITT_T6;
#endif
#ifdef HAVE_TIFF_DCS
case COMPRESSION_DCS: return SAIL_COMPRESSION_DCS;
#endif
#ifdef HAVE_TIFF_DEFLATE
case COMPRESSION_DEFLATE: return SAIL_COMPRESSION_DEFLATE;
#endif
#ifdef HAVE_TIFF_IT8BL
case COMPRESSION_IT8BL: return SAIL_COMPRESSION_IT8_BL;
#endif
#ifdef HAVE_TIFF_IT8CTPAD
case COMPRESSION_IT8CTPAD: return SAIL_COMPRESSION_IT8_CTPAD;
#endif
#ifdef HAVE_TIFF_IT8LW
case COMPRESSION_IT8LW: return SAIL_COMPRESSION_IT8_LW;
#endif
#ifdef HAVE_TIFF_IT8MP
case COMPRESSION_IT8MP: return SAIL_COMPRESSION_IT8_MP;
#endif
#ifdef HAVE_TIFF_JBIG
case COMPRESSION_JBIG: return SAIL_COMPRESSION_JBIG;
#endif
#ifdef HAVE_TIFF_JPEG
case COMPRESSION_JPEG: return SAIL_COMPRESSION_JPEG;
#endif
#ifdef HAVE_TIFF_JP2000
case COMPRESSION_JP2000: return SAIL_COMPRESSION_JPEG2000;
#ifdef HAVE_TIFF_41
#endif
#ifdef HAVE_TIFF_LERC
case COMPRESSION_LERC: return SAIL_COMPRESSION_LERC;
#endif
#ifdef HAVE_TIFF_LZMA
case COMPRESSION_LZMA: return SAIL_COMPRESSION_LZMA;
#endif
#ifdef HAVE_TIFF_LZW
case COMPRESSION_LZW: return SAIL_COMPRESSION_LZW;
#endif
#ifdef HAVE_TIFF_NEXT
case COMPRESSION_NEXT: return SAIL_COMPRESSION_NEXT;
#endif
#ifdef HAVE_TIFF_NONE
case COMPRESSION_NONE: return SAIL_COMPRESSION_NONE;
#endif
#ifdef HAVE_TIFF_OJPEG
case COMPRESSION_OJPEG: return SAIL_COMPRESSION_OJPEG;
#endif
#ifdef HAVE_TIFF_PACKBITS
case COMPRESSION_PACKBITS: return SAIL_COMPRESSION_PACKBITS;
#endif
#ifdef HAVE_TIFF_PIXARFILM
case COMPRESSION_PIXARFILM: return SAIL_COMPRESSION_PIXAR_FILM;
#endif
#ifdef HAVE_TIFF_PIXARLOG
case COMPRESSION_PIXARLOG: return SAIL_COMPRESSION_PIXAR_LOG;
#endif
#ifdef HAVE_TIFF_SGILOG24
case COMPRESSION_SGILOG24: return SAIL_COMPRESSION_RLE;
#endif
#ifdef HAVE_TIFF_SGILOG
case COMPRESSION_SGILOG: return SAIL_COMPRESSION_SGI_LOG;
#endif
#ifdef HAVE_TIFF_T43
case COMPRESSION_T43: return SAIL_COMPRESSION_SGI_LOG24;
#endif
#ifdef HAVE_TIFF_T85
case COMPRESSION_T85: return SAIL_COMPRESSION_T43;
#endif
#ifdef HAVE_TIFF_THUNDERSCAN
case COMPRESSION_THUNDERSCAN: return SAIL_COMPRESSION_THUNDERSCAN;
#if defined HAVE_TIFF_41 && !defined SAIL_WIN32
#endif
#ifdef HAVE_TIFF_WEBP
case COMPRESSION_WEBP: return SAIL_COMPRESSION_WEBP;
#endif
#ifdef HAVE_TIFF_41
#ifdef HAVE_TIFF_ZSTD
case COMPRESSION_ZSTD: return SAIL_COMPRESSION_ZSTD;
#endif

Expand All @@ -126,18 +180,95 @@ sail_status_t tiff_private_sail_compression_to_compression(enum SailCompression
SAIL_CHECK_PTR(tiff_compression);

switch (compression) {
#ifdef HAVE_TIFF_WRITE_ADOBE_DEFLATE
case SAIL_COMPRESSION_ADOBE_DEFLATE: *tiff_compression = COMPRESSION_ADOBE_DEFLATE; return SAIL_OK;
case SAIL_COMPRESSION_DEFLATE: *tiff_compression = COMPRESSION_DEFLATE; return SAIL_OK;
case SAIL_COMPRESSION_JPEG: *tiff_compression = COMPRESSION_JPEG; return SAIL_OK;
case SAIL_COMPRESSION_LZW: *tiff_compression = COMPRESSION_LZW; return SAIL_OK;
case SAIL_COMPRESSION_NONE: *tiff_compression = COMPRESSION_NONE; return SAIL_OK;
case SAIL_COMPRESSION_PACKBITS: *tiff_compression = COMPRESSION_PACKBITS; return SAIL_OK;
case SAIL_COMPRESSION_PIXAR_LOG: *tiff_compression = COMPRESSION_PIXARLOG; return SAIL_OK;
#ifdef HAVE_TIFF_41
#if !defined SAIL_WIN32
case SAIL_COMPRESSION_WEBP: *tiff_compression = COMPRESSION_WEBP; return SAIL_OK;
#endif
case SAIL_COMPRESSION_ZSTD: *tiff_compression = COMPRESSION_ZSTD; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_CCITTRLE
case SAIL_COMPRESSION_CCITT_RLE: *tiff_compression = COMPRESSION_CCITTRLE; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_CCITTRLEW
case SAIL_COMPRESSION_CCITT_RLEW: *tiff_compression = COMPRESSION_CCITTRLEW; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_CCITT_T4
case SAIL_COMPRESSION_CCITT_T4: *tiff_compression = COMPRESSION_CCITT_T4; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_CCITT_T6
case SAIL_COMPRESSION_CCITT_T6: *tiff_compression = COMPRESSION_CCITT_T6; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_DCS
case SAIL_COMPRESSION_DCS: *tiff_compression = COMPRESSION_DCS; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_DEFLATE
case SAIL_COMPRESSION_DEFLATE: *tiff_compression = COMPRESSION_DEFLATE; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_IT8BL
case SAIL_COMPRESSION_IT8_BL: *tiff_compression = COMPRESSION_IT8BL; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_IT8CTPAD
case SAIL_COMPRESSION_IT8_CTPAD: *tiff_compression = COMPRESSION_IT8CTPAD; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_IT8LW
case SAIL_COMPRESSION_IT8_LW: *tiff_compression = COMPRESSION_IT8LW; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_IT8MP
case SAIL_COMPRESSION_IT8_MP: *tiff_compression = COMPRESSION_IT8MP; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_JBIG
case SAIL_COMPRESSION_JBIG: *tiff_compression = COMPRESSION_JBIG; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_JPEG
case SAIL_COMPRESSION_JPEG: *tiff_compression = COMPRESSION_JPEG; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_JP2000
case SAIL_COMPRESSION_JPEG2000: *tiff_compression = COMPRESSION_JP2000; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_LERC
case SAIL_COMPRESSION_LERC: *tiff_compression = COMPRESSION_LERC; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_LZMA
case SAIL_COMPRESSION_LZMA: *tiff_compression = COMPRESSION_LZMA; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_LZW
case SAIL_COMPRESSION_LZW: *tiff_compression = COMPRESSION_LZW; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_NEXT
case SAIL_COMPRESSION_NEXT: *tiff_compression = COMPRESSION_NEXT; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_NONE
case SAIL_COMPRESSION_NONE: *tiff_compression = COMPRESSION_NONE; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_OJPEG
case SAIL_COMPRESSION_OJPEG: *tiff_compression = COMPRESSION_OJPEG; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_PACKBITS
case SAIL_COMPRESSION_PACKBITS: *tiff_compression = COMPRESSION_PACKBITS; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_PIXARFILM
case SAIL_COMPRESSION_PIXAR_FILM: *tiff_compression = COMPRESSION_PIXARFILM; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_PIXARLOG
case SAIL_COMPRESSION_PIXAR_LOG: *tiff_compression = COMPRESSION_PIXARLOG; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_SGILOG24
case SAIL_COMPRESSION_RLE: *tiff_compression = COMPRESSION_SGILOG24; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_SGILOG
case SAIL_COMPRESSION_SGI_LOG: *tiff_compression = COMPRESSION_SGILOG; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_T43
case SAIL_COMPRESSION_SGI_LOG24: *tiff_compression = COMPRESSION_T43; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_T85
case SAIL_COMPRESSION_T43: *tiff_compression = COMPRESSION_T85; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_THUNDERSCAN
case SAIL_COMPRESSION_THUNDERSCAN: *tiff_compression = COMPRESSION_THUNDERSCAN; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_WEBP
case SAIL_COMPRESSION_WEBP: *tiff_compression = COMPRESSION_WEBP; return SAIL_OK;
#endif
#ifdef HAVE_TIFF_WRITE_ZSTD
case SAIL_COMPRESSION_ZSTD: *tiff_compression = COMPRESSION_ZSTD; return SAIL_OK;
#endif

default: {
Expand Down
111 changes: 88 additions & 23 deletions src/sail-codecs/tiff/tiff.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -12,32 +12,97 @@ macro(sail_find_dependencies)
endmacro()

macro(sail_codec_post_add)
cmake_push_check_state(RESET)
set(CMAKE_REQUIRED_INCLUDES ${sail_tiff_include_dirs})
set(TIFF_CODECS ADOBE_DEFLATE CCITTRLE CCITTRLEW CCITT_T4 CCITT_T6 DCS DEFLATE IT8BL IT8CTPAD IT8LW
IT8MP JBIG JPEG JP2000 LERC LZMA LZW NEXT NONE OJPEG PACKBITS PIXARFILM PIXARLOG
SGILOG24 SGILOG T43 T85 THUNDERSCAN WEBP ZSTD)

check_c_source_compiles(
foreach (tiff_codec IN LISTS TIFF_CODECS)
# Check compression definitions
#
cmake_push_check_state(RESET)
set(CMAKE_REQUIRED_INCLUDES ${sail_tiff_include_dirs})

check_c_source_compiles(
"
#include <tiff.h>
int main(int argc, char *argv[]) {
int compression = COMPRESSION_${tiff_codec};
return 0;
}
"
#include <tiff.h>
int main(int argc, char *argv[]) {
int compression = COMPRESSION_WEBP;
return 0;
}
"
HAVE_TIFF_41
)
cmake_pop_check_state()

if (HAVE_TIFF_41)
# We compile libtiff w/o WEBP support on Windows
if (WIN32)
set(CODEC_INFO_COMPRESSIONS_41 "ZSTD")
else()
set(CODEC_INFO_COMPRESSIONS_41 "WEBP;ZSTD")
HAVE_TIFF_${tiff_codec}
)
cmake_pop_check_state()

if (HAVE_TIFF_${tiff_codec})
target_compile_definitions(${TARGET} PRIVATE HAVE_TIFF_${tiff_codec})
endif()
endif()

if (HAVE_TIFF_41)
target_compile_definitions(${TARGET} PRIVATE HAVE_TIFF_41)
# Check if we can actually write defined compressions
#
cmake_push_check_state(RESET)
set(CMAKE_REQUIRED_INCLUDES ${sail_tiff_include_dirs})
set(CMAKE_REQUIRED_LIBRARIES ${sail_tiff_libs})

check_c_source_runs(
"
#include <stdlib.h>
#include <string.h>
#include <tiffio.h>
int main(int argc, char *argv[]) {
TIFF *tiff = TIFFOpen(\"file.tiff\", \"w\");
if (tiff == NULL) {
return 1;
}
TIFFSetField(tiff, TIFFTAG_IMAGEWIDTH, 1);
TIFFSetField(tiff, TIFFTAG_IMAGELENGTH, 1);
TIFFSetField(tiff, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(tiff, TIFFTAG_SAMPLESPERPIXEL, 4);
TIFFSetField(tiff, TIFFTAG_BITSPERSAMPLE, 8);
TIFFSetField(tiff, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(tiff, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
TIFFSetField(tiff, TIFFTAG_COMPRESSION, COMPRESSION_${tiff_codec});
TIFFSetField(tiff, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tiff, (uint32)-1));
unsigned char *scan = malloc(4);
memset(scan, 255, 4);
if (TIFFWriteScanline(tiff, scan, 0, 0) < 0) {
return 2;
}
TIFFClose(tiff);
free(scan);
return 0;
}
"
HAVE_TIFF_WRITE_${tiff_codec}
)
cmake_pop_check_state()

if (HAVE_TIFF_WRITE_${tiff_codec})
# ADOBE_DEFLATE -> ADOBE-DEFLATE
# JP2000 -> JPEG2000
string(REPLACE "_" "-" tiff_codec_fixed ${tiff_codec})
string(REPLACE "JP2000" "JPEG2000" tiff_codec_fixed ${tiff_codec_fixed})
list(APPEND CODEC_INFO_COMPRESSIONS ${tiff_codec_fixed})

target_compile_definitions(${TARGET} PRIVATE HAVE_TIFF_WRITE_${tiff_codec})
endif()
endforeach()

# Default compression
#
if (JPEG IN_LIST CODEC_INFO_COMPRESSIONS)
set(CODEC_INFO_DEFAULT_COMPRESSION JPEG)
else()
set(CODEC_INFO_DEFAULT_COMPRESSION NONE)
endif()
endmacro()
4 changes: 2 additions & 2 deletions src/sail-codecs/tiff/tiff.codec.info.in
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ default-output-pixel-format=@SAIL_DEFAULT_READ_OUTPUT_PIXEL_FORMAT@
features=STATIC;MULTI-FRAME;META-DATA;ICCP
properties=
interlaced-passes=1
compression-types=ADOBE-DEFLATE;DEFLATE;JPEG;LZW;NONE;PACKBITS;PIXAR-LOG;@CODEC_INFO_COMPRESSIONS_41@
default-compression=JPEG
compression-types=@CODEC_INFO_COMPRESSIONS@
default-compression=@CODEC_INFO_DEFAULT_COMPRESSION@
compression-level-min=0
compression-level-max=0
compression-level-default=0
Expand Down

0 comments on commit 6250cce

Please sign in to comment.