1 cmake_minimum_required(VERSION 2.8.12)
2 # When using CMake 3.4 and later, don't export symbols from executables unless
3 # the CMAKE_ENABLE_EXPORTS variable is set.
5 cmake_policy(SET CMP0065 NEW)
8 if(CMAKE_EXECUTABLE_SUFFIX)
9 set(CMAKE_EXECUTABLE_SUFFIX_TMP ${CMAKE_EXECUTABLE_SUFFIX})
12 project(libjpeg-turbo C)
14 string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
15 list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
16 list(GET VERSION_TRIPLET 1 VERSION_MINOR)
17 list(GET VERSION_TRIPLET 2 VERSION_REVISION)
18 function(pad_number NUMBER OUTPUT_LEN)
19 string(LENGTH "${${NUMBER}}" INPUT_LEN)
20 if(INPUT_LEN LESS OUTPUT_LEN)
21 math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
23 foreach(C RANGE ${ZEROES})
26 set(${NUMBER} ${NUM} PARENT_SCOPE)
29 pad_number(VERSION_MINOR 3)
30 pad_number(VERSION_REVISION 3)
31 set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
33 # CMake 3.14 and later sets CMAKE_MACOSX_BUNDLE to TRUE by default when
34 # CMAKE_SYSTEM_NAME is iOS, tvOS, or watchOS, which breaks the libjpeg-turbo
35 # build. (Specifically, when CMAKE_MACOSX_BUNDLE is TRUE, executables for
36 # Apple platforms are built as application bundles, which causes CMake to
37 # complain that our install() directives for executables do not specify a
38 # BUNDLE DESTINATION. Even if CMake did not complain, building executables as
39 # application bundles would break our iOS packages.)
40 set(CMAKE_MACOSX_BUNDLE FALSE)
42 string(TIMESTAMP DEFAULT_BUILD "%Y%m%d")
43 set(BUILD ${DEFAULT_BUILD} CACHE STRING "Build string (default: ${DEFAULT_BUILD})")
45 # NOTE: On Windows, this does nothing except when using MinGW or Cygwin.
46 # CMAKE_BUILD_TYPE has no meaning in Visual Studio, and it always defaults to
47 # Debug when using NMake.
48 if(NOT CMAKE_BUILD_TYPE)
49 set(CMAKE_BUILD_TYPE Release)
51 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
53 message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
55 # Detect CPU type and whether we're building 64-bit or 32-bit code
56 math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
57 string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC)
59 foreach(ARCH ${CMAKE_OSX_ARCHITECTURES})
61 message(FATAL_ERROR "The libjpeg-turbo build system does not support multiple values in CMAKE_OSX_ARCHITECTURES.")
63 math(EXPR COUNT "${COUNT}+1")
65 if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
66 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
67 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
68 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
69 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
70 if(BITS EQUAL 64 OR CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
75 if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ${CPU_TYPE})
76 set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
78 elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
79 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^arm")
85 elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^ppc" OR
86 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "^powerpc")
89 set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
91 if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR
92 CMAKE_OSX_ARCHITECTURES MATCHES "arm64" OR
93 CMAKE_OSX_ARCHITECTURES MATCHES "i386")
94 set(CPU_TYPE ${CMAKE_OSX_ARCHITECTURES})
96 if(CMAKE_OSX_ARCHITECTURES MATCHES "ppc")
99 if(MSVC_IDE AND CMAKE_GENERATOR_PLATFORM MATCHES "arm64")
103 message(STATUS "${BITS}-bit build (${CPU_TYPE})")
106 ###############################################################################
107 # INSTALL DIRECTORIES
108 ###############################################################################
112 set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}")
114 set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}-gcc")
117 set(CMAKE_INSTALL_DEFAULT_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}64")
120 if(NOT CMAKE_INSTALL_DEFAULT_PREFIX)
121 set(CMAKE_INSTALL_DEFAULT_PREFIX /opt/${CMAKE_PROJECT_NAME})
124 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
125 set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}" CACHE PATH
126 "Directory into which to install ${CMAKE_PROJECT_NAME} (default: ${CMAKE_INSTALL_DEFAULT_PREFIX})"
129 message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
131 # When the prefix is /opt/${CMAKE_PROJECT_NAME}, we assume that an "official"
132 # build is being created, and thus we install things into specific locations.
134 if(CMAKE_INSTALL_PREFIX STREQUAL "${CMAKE_INSTALL_DEFAULT_PREFIX}")
135 set(CMAKE_INSTALL_DEFAULT_DATAROOTDIR "")
136 set(CMAKE_INSTALL_DEFAULT_DOCDIR "<CMAKE_INSTALL_DATAROOTDIR>/doc")
137 set(CMAKE_INSTALL_DEFAULT_JAVADIR "<CMAKE_INSTALL_DATAROOTDIR>/classes")
138 if(UNIX AND NOT APPLE)
140 set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
141 elseif(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
142 set(CMAKE_INSTALL_DEFAULT_LIBDIR "libx32")
144 set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib32")
149 include(cmakescripts/GNUInstallDirs.cmake)
151 macro(report_directory var)
152 if(CMAKE_INSTALL_${var} STREQUAL CMAKE_INSTALL_FULL_${var})
153 message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}}")
155 message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}} (${CMAKE_INSTALL_FULL_${var}})")
157 mark_as_advanced(CLEAR CMAKE_INSTALL_${var})
160 set(DIRLIST "BINDIR;DATAROOTDIR;DOCDIR;INCLUDEDIR;LIBDIR")
162 list(APPEND DIRLIST "MANDIR")
164 foreach(dir ${DIRLIST})
165 report_directory(${dir})
169 ###############################################################################
170 # CONFIGURATION OPTIONS
171 ###############################################################################
173 macro(boolean_number var)
175 set(${var} 1 ${ARGN})
177 set(${var} 0 ${ARGN})
181 option(ENABLE_SHARED "Build shared libraries" TRUE)
182 boolean_number(ENABLE_SHARED)
183 option(ENABLE_STATIC "Build static libraries" TRUE)
184 boolean_number(ENABLE_STATIC)
185 option(REQUIRE_SIMD "Generate a fatal error if SIMD extensions are not available for this platform (default is to fall back to a non-SIMD build)" FALSE)
186 boolean_number(REQUIRE_SIMD)
187 option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_ARITH_DEC=0 WITH_ARITH_ENC=0 WITH_JAVA=0 WITH_SIMD=0 WITH_TURBOJPEG=0 )" FALSE)
188 boolean_number(WITH_12BIT)
189 option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
190 boolean_number(WITH_ARITH_DEC)
191 option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
192 boolean_number(WITH_ARITH_ENC)
193 if(CMAKE_C_COMPILER_ABI MATCHES "ELF X32")
196 option(WITH_JAVA "Build Java wrapper for the TurboJPEG API library (implies ENABLE_SHARED=1)" FALSE)
197 boolean_number(WITH_JAVA)
199 option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
200 boolean_number(WITH_JPEG7)
201 option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
202 boolean_number(WITH_JPEG8)
203 option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
204 boolean_number(WITH_MEM_SRCDST)
205 option(WITH_SIMD "Include SIMD extensions, if available for this platform" TRUE)
206 boolean_number(WITH_SIMD)
207 option(WITH_TURBOJPEG "Include the TurboJPEG API library and associated test programs" TRUE)
208 boolean_number(WITH_TURBOJPEG)
209 option(WITH_FUZZ "Build fuzz targets" FALSE)
210 option(ENABLE_COLOR_PICKER "Enable color picker for product TV" FALSE)
211 boolean_number(ENABLE_COLOR_PICKER)
213 macro(report_option var desc)
215 message(STATUS "${desc} enabled (${var} = ${${var}})")
217 message(STATUS "${desc} disabled (${var} = ${${var}})")
225 # Explicitly setting CMAKE_POSITION_INDEPENDENT_CODE=FALSE disables PIC for all
226 # targets, which will cause the shared library builds to fail. Thus, if shared
227 # libraries are enabled and CMAKE_POSITION_INDEPENDENT_CODE is explicitly set
228 # to FALSE, we need to unset it, thus restoring the default behavior
229 # (automatically using PIC for shared library targets.)
230 if(DEFINED CMAKE_POSITION_INDEPENDENT_CODE AND
231 NOT CMAKE_POSITION_INDEPENDENT_CODE AND ENABLE_SHARED)
232 unset(CMAKE_POSITION_INDEPENDENT_CODE CACHE)
235 report_option(ENABLE_SHARED "Shared libraries")
236 report_option(ENABLE_STATIC "Static libraries")
239 set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
242 if(WITH_JPEG8 OR WITH_JPEG7)
243 set(WITH_ARITH_ENC 1)
244 set(WITH_ARITH_DEC 1)
247 set(WITH_MEM_SRCDST 0)
251 set(WITH_ARITH_DEC 0)
252 set(WITH_ARITH_ENC 0)
255 set(WITH_TURBOJPEG 0)
256 set(BITS_IN_JSAMPLE 12)
258 set(BITS_IN_JSAMPLE 8)
260 report_option(WITH_12BIT "12-bit JPEG support")
263 set(D_ARITH_CODING_SUPPORTED 1)
266 report_option(WITH_ARITH_DEC "Arithmetic decoding support")
270 set(C_ARITH_CODING_SUPPORTED 1)
273 report_option(WITH_ARITH_ENC "Arithmetic encoding support")
277 report_option(WITH_TURBOJPEG "TurboJPEG API library")
278 report_option(WITH_JAVA "TurboJPEG Java wrapper")
282 set(MEM_SRCDST_SUPPORTED 1)
283 set(MEM_SRCDST_FUNCTIONS "global: jpeg_mem_dest; jpeg_mem_src;")
286 report_option(WITH_MEM_SRCDST "In-memory source/destination managers")
295 set(JPEG_LIB_VERSION 80)
297 set(JPEG_LIB_VERSION 70)
299 set(JPEG_LIB_VERSION 62)
302 if(ENABLE_COLOR_PICKER)
303 set(COLOR_PICKER_ENABLE 1)
305 set(COLOR_PICKER_ENABLE 0)
308 math(EXPR JPEG_LIB_VERSION_DIV10 "${JPEG_LIB_VERSION} / 10")
309 math(EXPR JPEG_LIB_VERSION_MOD10 "${JPEG_LIB_VERSION} % 10")
310 if(JPEG_LIB_VERSION STREQUAL "62")
311 set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION})
313 set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION_DIV10})
315 if(JPEG_LIB_VERSION STREQUAL "80")
316 set(DEFAULT_SO_MINOR_VERSION 2)
318 set(DEFAULT_SO_MINOR_VERSION 0)
321 # This causes SO_MAJOR_VERSION/SO_MINOR_VERSION to reset to defaults if
322 # WITH_JPEG7 or WITH_JPEG8 has changed.
323 if((DEFINED WITH_JPEG7_INT AND NOT WITH_JPEG7 EQUAL WITH_JPEG7_INT) OR
324 (DEFINED WITH_JPEG8_INT AND NOT WITH_JPEG8 EQUAL WITH_JPEG8_INT))
325 set(FORCE_SO_VERSION "FORCE")
327 set(WITH_JPEG7_INT ${WITH_JPEG7} CACHE INTERNAL "")
328 set(WITH_JPEG8_INT ${WITH_JPEG8} CACHE INTERNAL "")
330 set(SO_MAJOR_VERSION ${DEFAULT_SO_MAJOR_VERSION} CACHE STRING
331 "Major version of the libjpeg API shared library (default: ${DEFAULT_SO_MAJOR_VERSION})"
333 set(SO_MINOR_VERSION ${DEFAULT_SO_MINOR_VERSION} CACHE STRING
334 "Minor version of the libjpeg API shared library (default: ${DEFAULT_SO_MINOR_VERSION})"
337 set(JPEG_LIB_VERSION_DECIMAL "${JPEG_LIB_VERSION_DIV10}.${JPEG_LIB_VERSION_MOD10}")
338 message(STATUS "Emulating libjpeg API/ABI v${JPEG_LIB_VERSION_DECIMAL} (WITH_JPEG7 = ${WITH_JPEG7}, WITH_JPEG8 = ${WITH_JPEG8})")
339 message(STATUS "libjpeg API shared library version = ${SO_MAJOR_VERSION}.${SO_AGE}.${SO_MINOR_VERSION}")
341 # Because the TurboJPEG API library uses versioned symbols and changes the
342 # names of functions whenever they are modified in a backward-incompatible
343 # manner, it is always backward-ABI-compatible with itself, so the major and
344 # minor SO versions don't change. However, we increase the middle number (the
345 # SO "age") whenever functions are added to the API.
346 set(TURBOJPEG_SO_MAJOR_VERSION 0)
347 set(TURBOJPEG_SO_VERSION 0.2.0)
350 ###############################################################################
352 ###############################################################################
356 "Link all ${CMAKE_PROJECT_NAME} libraries and executables with the C run-time DLL (msvcr*.dll) instead of the static C run-time library (libcmt*.lib.) The default is to use the C run-time DLL only with the libraries and executables that need it."
359 # Use the static C library for all build types
360 foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
361 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
362 if(${var} MATCHES "/MD")
363 string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
367 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4996")
370 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
371 # Use the maximum optimization level for release builds
372 foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
373 if(${var} MATCHES "-O2")
374 string(REGEX REPLACE "-O2" "-O3" ${var} "${${var}}")
379 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
380 if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
381 # Use the maximum optimization level for release builds
382 foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
383 if(${var} MATCHES "-xO3")
384 string(REGEX REPLACE "-xO3" "-xO5" ${var} "${${var}}")
386 if(${var} MATCHES "-xO2")
387 string(REGEX REPLACE "-xO2" "-xO5" ${var} "${${var}}")
393 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
395 set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
396 message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
398 set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
399 message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
401 include(CheckCSourceCompiles)
402 include(CheckIncludeFiles)
403 include(CheckTypeSize)
405 check_type_size("size_t" SIZE_T)
406 check_type_size("unsigned long" UNSIGNED_LONG)
408 if(SIZE_T EQUAL UNSIGNED_LONG)
409 check_c_source_compiles("int main(int argc, char **argv) { unsigned long a = argc; return __builtin_ctzl(a); }"
413 check_include_files("intrin.h" HAVE_INTRIN_H)
418 check_include_files(locale.h HAVE_LOCALE_H)
419 check_include_files(stddef.h HAVE_STDDEF_H)
420 check_include_files(stdlib.h HAVE_STDLIB_H)
421 check_include_files(sys/types.h NEED_SYS_TYPES_H)
423 # Check for functions
424 include(CheckSymbolExists)
425 check_symbol_exists(memset string.h HAVE_MEMSET)
426 check_symbol_exists(memcpy string.h HAVE_MEMCPY)
427 if(NOT HAVE_MEMSET AND NOT HAVE_MEMCPY)
428 set(NEED_BSD_STRINGS 1)
432 check_type_size("unsigned char" UNSIGNED_CHAR)
433 check_type_size("unsigned short" UNSIGNED_SHORT)
435 # Check for compiler features
436 check_c_source_compiles("int main(void) { typedef struct undefined_structure *undef_struct_ptr; undef_struct_ptr ptr = 0; return ptr != 0; }"
439 message(STATUS "Compiler supports pointers to undefined structures.")
441 set(INCOMPLETE_TYPES_BROKEN 1)
442 message(STATUS "Compiler does not support pointers to undefined structures.")
445 if(CMAKE_CROSSCOMPILING)
446 set(RIGHT_SHIFT_IS_UNSIGNED 0)
448 include(CheckCSourceRuns)
449 check_c_source_runs("
452 int is_shifting_signed (long arg) {
454 if (res == -0x7F7E80CL)
455 return 1; /* right shift is signed */
456 /* see if unsigned-shift hack will fix it. */
457 /* we can't just test exact value since it depends on width of long... */
458 res |= (~0L) << (32-4);
459 if (res == -0x7F7E80CL)
460 return 0; /* right shift is unsigned */
461 printf(\"Right shift isn't acting as I expect it to.\\\\n\");
462 printf(\"I fear the JPEG software will not work at all.\\\\n\\\\n\");
463 return 0; /* try it with unsigned anyway */
466 exit(is_shifting_signed(-0x7F7E80B1L));
467 }" RIGHT_SHIFT_IS_UNSIGNED)
472 set(INLINE_OPTIONS "__inline;inline")
474 set(INLINE_OPTIONS "__inline__;inline")
476 option(FORCE_INLINE "Force function inlining" TRUE)
477 boolean_number(FORCE_INLINE)
480 list(INSERT INLINE_OPTIONS 0 "__forceinline")
482 list(INSERT INLINE_OPTIONS 0 "inline __attribute__((always_inline))")
483 list(INSERT INLINE_OPTIONS 0 "__inline__ __attribute__((always_inline))")
486 foreach(inline ${INLINE_OPTIONS})
487 check_c_source_compiles("${inline} static int foo(void) { return 0; } int main(void) { return foo(); }"
490 set(INLINE ${inline})
495 message(FATAL_ERROR "Could not determine how to inline functions.")
497 message(STATUS "INLINE = ${INLINE} (FORCE_INLINE = ${FORCE_INLINE})")
501 set(THREAD_LOCAL "__declspec(thread)")
503 set(THREAD_LOCAL "__thread")
505 check_c_source_compiles("${THREAD_LOCAL} int i; int main(void) { i = 0; return i; }" HAVE_THREAD_LOCAL)
506 if(HAVE_THREAD_LOCAL)
507 message(STATUS "THREAD_LOCAL = ${THREAD_LOCAL}")
509 message(WARNING "Thread-local storage is not available. The TurboJPEG API library's global error handler will not be thread-safe.")
514 if(UNIX AND NOT APPLE)
515 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map "VERS_1 { global: *; };")
516 set(CMAKE_REQUIRED_FLAGS
517 "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
518 check_c_source_compiles("int main(void) { return 0; }" HAVE_VERSION_SCRIPT)
519 set(CMAKE_REQUIRED_FLAGS)
520 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
521 if(HAVE_VERSION_SCRIPT)
522 message(STATUS "Linker supports GNU-style version scripts")
523 set(MAPFLAG "-Wl,--version-script,")
524 set(TJMAPFLAG "-Wl,--version-script,")
526 message(STATUS "Linker does not support GNU-style version scripts")
527 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
528 # The Solaris linker doesn't like our version script for the libjpeg API
529 # library, but the version script for the TurboJPEG API library should
531 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map
532 "VERS_1 { global: foo; local: *; }; VERS_2 { global: foo2; } VERS_1;")
533 set(CMAKE_REQUIRED_FLAGS "-Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/conftest.map -shared")
534 check_c_source_compiles("int foo() { return 0; } int foo2() { return 2; }"
536 set(CMAKE_REQUIRED_FLAGS)
537 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
539 message(STATUS "Linker supports mapfiles")
540 set(TJMAPFLAG "-Wl,-M,")
542 message(STATUS "Linker does not support mapfiles")
550 configure_file(win/jconfig.h.in jconfig.h)
552 configure_file(jconfig.h.in jconfig.h)
554 configure_file(jconfigint.h.in jconfigint.h)
556 configure_file(libjpeg.map.in libjpeg.map)
559 # Include directories and compiler definitions
560 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
563 ###############################################################################
565 ###############################################################################
567 if(CMAKE_EXECUTABLE_SUFFIX_TMP)
568 set(CMAKE_EXECUTABLE_SUFFIX ${CMAKE_EXECUTABLE_SUFFIX_TMP})
570 message(STATUS "CMAKE_EXECUTABLE_SUFFIX = ${CMAKE_EXECUTABLE_SUFFIX}")
572 set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
573 jcicc.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
574 jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
575 jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
576 jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c
577 jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c
578 jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
580 if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
581 set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
585 set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
589 set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
593 add_subdirectory(simd)
595 add_definitions(-DNEON_INTRINSICS)
597 elseif(NOT WITH_12BIT)
598 message(STATUS "SIMD extensions: None (WITH_SIMD = ${WITH_SIMD})")
601 message(STATUS "SIMD extensions: ${CPU_TYPE} (WITH_SIMD = ${WITH_SIMD})")
602 if(MSVC_IDE OR XCODE)
603 set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
606 add_library(simd OBJECT jsimd_none.c)
607 if(NOT WIN32 AND (CMAKE_POSITION_INDEPENDENT_CODE OR ENABLE_SHARED))
608 set_target_properties(simd PROPERTIES POSITION_INDEPENDENT_CODE 1)
613 add_subdirectory(java)
617 add_subdirectory(sharedlib)
621 add_library(jpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
624 set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
630 set(TURBOJPEG_SOURCES ${JPEG_SOURCES} $<TARGET_OBJECTS:simd> ${SIMD_OBJS}
631 turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c rdppm.c
633 set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile)
635 set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
636 include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
637 set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile.jni)
639 add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
640 set_property(TARGET turbojpeg PROPERTY COMPILE_FLAGS
641 "-DBMP_SUPPORTED -DPPM_SUPPORTED")
643 set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
646 set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
648 if(APPLE AND (NOT CMAKE_OSX_DEPLOYMENT_TARGET OR
649 CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER 10.4))
650 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
651 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
653 set_target_properties(turbojpeg PROPERTIES MACOSX_RPATH 1)
655 set_target_properties(turbojpeg PROPERTIES
656 SOVERSION ${TURBOJPEG_SO_MAJOR_VERSION} VERSION ${TURBOJPEG_SO_VERSION})
658 set_target_properties(turbojpeg PROPERTIES
659 LINK_FLAGS "${TJMAPFLAG}${TJMAPFILE}")
662 add_executable(tjunittest tjunittest.c tjutil.c md5/md5.c md5/md5hl.c)
663 target_link_libraries(tjunittest turbojpeg)
665 add_executable(tjbench tjbench.c tjutil.c)
666 target_link_libraries(tjbench turbojpeg)
668 target_link_libraries(tjbench m)
671 add_executable(tjexample tjexample.c)
672 target_link_libraries(tjexample turbojpeg)
676 add_library(turbojpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
677 ${SIMD_OBJS} turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c
678 rdppm.c wrbmp.c wrppm.c)
679 set_property(TARGET turbojpeg-static PROPERTY COMPILE_FLAGS
680 "-DBMP_SUPPORTED -DPPM_SUPPORTED")
682 set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
685 add_executable(tjunittest-static tjunittest.c tjutil.c md5/md5.c
687 target_link_libraries(tjunittest-static turbojpeg-static)
689 add_executable(tjbench-static tjbench.c tjutil.c)
690 target_link_libraries(tjbench-static turbojpeg-static)
692 target_link_libraries(tjbench-static m)
698 set(USE_SETMODE "-DUSE_SETMODE")
701 set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED ${USE_SETMODE}")
703 set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
704 set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
705 set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
709 add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
710 ${CJPEG_BMP_SOURCES})
711 set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
712 target_link_libraries(cjpeg-static jpeg-static)
714 add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
715 wrppm.c ${DJPEG_BMP_SOURCES})
716 set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
717 target_link_libraries(djpeg-static jpeg-static)
719 add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
720 target_link_libraries(jpegtran-static jpeg-static)
721 set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
724 add_executable(rdjpgcom rdjpgcom.c)
726 add_executable(wrjpgcom wrjpgcom.c)
729 ###############################################################################
731 ###############################################################################
734 add_subdirectory(fuzz)
737 add_subdirectory(md5)
739 if(MSVC_IDE OR XCODE)
740 set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
748 set(TESTORIG testorig12.jpg)
749 set(MD5_JPEG_RGB_ISLOW 9d7369207c520d37f2c1cbfcb82b2964)
750 set(MD5_JPEG_RGB_ISLOW2 a00bd20d8ae49684640ef7177d2e0b64)
751 set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
752 set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
753 set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
754 set(MD5_JPEG_440_ISLOW e25c1912e38367be505a89c410c1c2d2)
755 set(MD5_PPM_440_ISLOW e7d2e26288870cfcb30f3114ad01e380)
756 set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
757 set(MD5_JPEG_420_IFAST_Q100_PROG 9447cef4803d9b0f74bcf333cc710a29)
758 set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
759 set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
760 set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
761 set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
762 set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
763 set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
765 set(MD5_JPEG_3x2_FLOAT_PROG_SSE a8c17daf77b457725ec929e215b603f8)
766 set(MD5_PPM_3x2_FLOAT_SSE 42876ab9e5c2f76a87d08db5fbd57956)
767 set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT a8c17daf77b457725ec929e215b603f8)
768 set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
769 set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
770 ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
771 set(MD5_PPM_3x2_FLOAT_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
772 set(MD5_JPEG_3x2_FLOAT_PROG_387 bc6dbbefac2872f6b9d6c4a0ae60c3c0)
773 set(MD5_PPM_3x2_FLOAT_387 bcc5723c61560463ac60f772e742d092)
774 set(MD5_JPEG_3x2_FLOAT_PROG_MSVC e27840755870fa849872e58aa0cd1400)
775 set(MD5_PPM_3x2_FLOAT_MSVC 6c2880b83bb1aa41dfe330e7a9768690)
777 set(MD5_JPEG_3x2_IFAST_PROG 1396cc2b7185cfe943d408c9d305339e)
778 set(MD5_PPM_3x2_IFAST 3975985ef6eeb0a2cdc58daa651ccc00)
779 set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
780 set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
781 set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
782 set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
783 set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
784 set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
785 set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
786 set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
787 set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
788 set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
789 set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
790 set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
791 set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
792 set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
793 set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
794 set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
795 set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
797 set(TESTORIG testorig.jpg)
798 set(MD5_JPEG_RGB_ISLOW 1d44a406f61da743b5fd31c0a9abdca3)
799 set(MD5_JPEG_RGB_ISLOW2 31d121e57b6c2934c890a7fc7763bcd4)
800 set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
801 set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
802 set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
803 set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
804 set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
805 set(MD5_JPEG_440_ISLOW 538bc02bd4b4658fd85de6ece6cbeda6)
806 set(MD5_PPM_440_ISLOW 11e7eab7ef7ef3276934bb7e7b6bb377)
807 set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
808 set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
809 set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
810 set(MD5_JPEG_420_IFAST_Q100_PROG 0ba15f9dab81a703505f835f9dbbac6d)
811 set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
812 set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
813 set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
814 set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
815 set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
816 set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
817 set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
818 set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
820 set(MD5_JPEG_3x2_FLOAT_PROG_SSE 343e3f8caf8af5986ebaf0bdc13b5c71)
821 set(MD5_PPM_3x2_FLOAT_SSE 1a75f36e5904d6fc3a85a43da9ad89bb)
822 set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT 9bca803d2042bd1eb03819e2bf92b3e5)
823 set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT f6bfab038438ed8f5522fbd33595dcdc)
824 set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
825 ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
826 set(MD5_PPM_3x2_FLOAT_FP_CONTRACT 0e917a34193ef976b679a6b069b1be26)
827 set(MD5_JPEG_3x2_FLOAT_PROG_387 1657664a410e0822c924b54f6f65e6e9)
828 set(MD5_PPM_3x2_FLOAT_387 cb0a1f027f3d2917c902b5640214e025)
829 set(MD5_JPEG_3x2_FLOAT_PROG_MSVC 7999ce9cd0ee9b6c7043b7351ab7639d)
830 set(MD5_PPM_3x2_FLOAT_MSVC 28cdc448a6b75e97892f0e0f8d4b21f3)
832 set(MD5_JPEG_3x2_IFAST_PROG 1ee5d2c1a77f2da495f993c8c7cceca5)
833 set(MD5_PPM_3x2_IFAST fd283664b3b49127984af0a7f118fccd)
834 set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
835 set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
836 set(MD5_PPM_420M_IFAST_ARI 57251da28a35b46eecb7177d82d10e0e)
837 set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
838 set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
839 set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
840 set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
841 set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
842 set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
843 set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
844 set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
845 set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
846 set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
847 set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
848 set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
849 set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
850 set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
851 set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
852 set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
853 set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
854 set(MD5_BMP_420M_ISLOW_565D ce034037d212bc403330df6f915c161b)
855 set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
856 set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
857 set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
858 set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
859 set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
860 set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
861 set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
862 set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
867 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
868 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
870 add_test(TJUnitTest-yuv
871 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
872 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
874 add_test(TJUnitTest-yuv-nopad
875 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
876 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
877 TJUnitTest -yuv -noyuvpad)
878 add_test(TJUnitTest-bi
879 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
880 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
882 add_test(TJUnitTest-bi-yuv
883 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
884 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
886 add_test(TJUnitTest-bi-yuv-nopad
887 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
888 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
889 TJUnitTest -bi -yuv -noyuvpad)
892 set(TEST_LIBTYPES "")
894 set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
897 set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
900 set(TESTIMAGES ${CMAKE_CURRENT_SOURCE_DIR}/testimages)
901 set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
902 if(CMAKE_CROSSCOMPILING)
903 file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
904 file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
907 # The output of the floating point DCT/IDCT algorithms differs depending on the
908 # type of floating point math used, so the FLOATTEST CMake variable must be
909 # set in order to tell the testing system which floating point results it
912 # sse = validate against the expected results from the libjpeg-turbo SSE SIMD
914 # no-fp-contract = validate against the expected results from the C code when
915 # floating point expression contraction is disabled (the
916 # default with Clang, with GCC when building for platforms
917 # that lack fused multiply-add [FMA] instructions, or when
918 # passing -ffp-contract=off to the compiler)
919 # fp-contract = validate against the expected results from the C code when
920 # floating point expression contraction is enabled (the default
921 # with GCC when building for platforms that have fused multiply-
922 # add [FMA] instructions or when passing -ffp-contract=fast to
924 # 387 = validate against the expected results from the C code when the 387 FPU
925 # is being used for floating point math (which is generally the default
926 # with x86 compilers)
927 # msvc = validate against the expected results from the C code when compiled
928 # with a 32-bit version of Visual C++
930 if(CPU_TYPE STREQUAL "x86_64" OR CPU_TYPE STREQUAL "i386")
932 set(DEFAULT_FLOATTEST sse)
933 elseif(CPU_TYPE STREQUAL "x86_64")
934 set(DEFAULT_FLOATTEST no-fp-contract)
935 elseif(CPU_TYPE STREQUAL "i386" AND MSVC)
936 set(DEFAULT_FLOATTEST msvc)
937 # else we can't really set an intelligent default for i386. The appropriate
938 # value could be 387, no-fp-contract, or fp-contract, depending on the
939 # compiler and compiler options. We leave it to the user to set FLOATTEST
943 if((CPU_TYPE STREQUAL "powerpc" OR CPU_TYPE STREQUAL "arm64") AND
944 NOT CMAKE_C_COMPILER_ID STREQUAL "Clang" AND NOT MSVC)
945 set(DEFAULT_FLOATTEST fp-contract)
947 set(DEFAULT_FLOATTEST no-fp-contract)
951 # This causes FLOATTEST to reset to the default value if WITH_SIMD has
953 if(DEFINED WITH_SIMD_INT AND NOT WITH_SIMD EQUAL WITH_SIMD_INT)
954 set(FORCE_FLOATTEST "FORCE")
956 set(WITH_SIMD_INT ${WITH_SIMD} CACHE INTERNAL "")
957 set(FLOATTEST ${DEFAULT_FLOATTEST} CACHE STRING
958 "The type of floating point math used by the floating point DCT/IDCT algorithms. This tells the testing system which numerical results it should expect from those tests. [sse = libjpeg-turbo x86/x86-64 SIMD extensions, no-fp-contract = generic FPU with floating point expression contraction disabled, fp-contract = generic FPU with floating point expression contraction enabled, 387 = 387 FPU, msvc = 32-bit Visual Studio] (default = ${DEFAULT_FLOATTEST})"
960 message(STATUS "FLOATTEST = ${FLOATTEST}")
963 string(TOUPPER ${FLOATTEST} FLOATTEST_UC)
964 string(REGEX REPLACE "-" "_" FLOATTEST_UC ${FLOATTEST_UC})
965 string(TOLOWER ${FLOATTEST} FLOATTEST)
966 if(NOT FLOATTEST STREQUAL "sse" AND
967 NOT FLOATTEST STREQUAL "no-fp-contract" AND
968 NOT FLOATTEST STREQUAL "fp-contract" AND NOT FLOATTEST STREQUAL "387" AND
969 NOT FLOATTEST STREQUAL "msvc")
970 message(FATAL_ERROR "\"${FLOATTEST}\" is not a valid value for FLOATTEST.")
974 foreach(libtype ${TEST_LIBTYPES})
975 if(libtype STREQUAL "static")
979 add_test(tjunittest-${libtype}
980 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix})
981 add_test(tjunittest-${libtype}-alloc
982 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -alloc)
983 add_test(tjunittest-${libtype}-yuv
984 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv)
985 add_test(tjunittest-${libtype}-yuv-alloc
986 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -alloc)
987 add_test(tjunittest-${libtype}-yuv-nopad
988 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -noyuvpad)
989 add_test(tjunittest-${libtype}-bmp
990 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -bmp)
992 set(MD5_PPM_GRAY_TILE 89d3ca21213d9d864b50b4e4e7de4ca6)
993 set(MD5_PPM_420_8x8_TILE 847fceab15c5b7b911cb986cf0f71de3)
994 set(MD5_PPM_420_16x16_TILE ca45552a93687e078f7137cc4126a7b0)
995 set(MD5_PPM_420_32x32_TILE d8676f1d6b68df358353bba9844f4a00)
996 set(MD5_PPM_420_64x64_TILE 4e4c1a3d7ea4bace4f868bcbe83b7050)
997 set(MD5_PPM_420_128x128_TILE f24c3429c52265832beab9df72a0ceae)
998 set(MD5_PPM_420M_8x8_TILE bc25320e1f4c31ce2e610e43e9fd173c)
999 set(MD5_PPM_420M_TILE 75ffdf14602258c5c189522af57fa605)
1000 set(MD5_PPM_422_8x8_TILE d83dacd9fc73b0a6f10c09acad64eb1e)
1001 set(MD5_PPM_422_16x16_TILE 35077fb610d72dd743b1eb0cbcfe10fb)
1002 set(MD5_PPM_422_32x32_TILE e6902ed8a449ecc0f0d6f2bf945f65f7)
1003 set(MD5_PPM_422_64x64_TILE 2b4502a8f316cedbde1da7bce3d2231e)
1004 set(MD5_PPM_422_128x128_TILE f0b5617d578f5e13c8eee215d64d4877)
1005 set(MD5_PPM_422M_8x8_TILE 828941d7f41cd6283abd6beffb7fd51d)
1006 set(MD5_PPM_422M_TILE e877ae1324c4a280b95376f7f018172f)
1007 set(MD5_PPM_444_TILE 7964e41e67cfb8d0a587c0aa4798f9c3)
1009 # Test compressing from/decompressing to an arbitrary subregion of a larger
1011 add_test(tjbench-${libtype}-tile-cp
1012 ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
1014 add_test(tjbench-${libtype}-tile
1015 ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tile.ppm 95
1016 -rgb -quiet -tile -benchtime 0.01 -warmup 0)
1017 set_tests_properties(tjbench-${libtype}-tile
1018 PROPERTIES DEPENDS tjbench-${libtype}-tile-cp)
1020 foreach(tile 8 16 32 64 128)
1021 add_test(tjbench-${libtype}-tile-gray-${tile}x${tile}-cmp
1022 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_GRAY_TILE}
1023 testout_tile_GRAY_Q95_${tile}x${tile}.ppm)
1024 foreach(subsamp 420 422)
1025 add_test(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
1026 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1027 ${MD5_PPM_${subsamp}_${tile}x${tile}_TILE}
1028 testout_tile_${subsamp}_Q95_${tile}x${tile}.ppm)
1030 add_test(tjbench-${libtype}-tile-444-${tile}x${tile}-cmp
1031 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_444_TILE}
1032 testout_tile_444_Q95_${tile}x${tile}.ppm)
1033 foreach(subsamp gray 420 422 444)
1034 set_tests_properties(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
1035 PROPERTIES DEPENDS tjbench-${libtype}-tile)
1039 add_test(tjbench-${libtype}-tilem-cp
1040 ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
1042 add_test(tjbench-${libtype}-tilem
1043 ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tilem.ppm 95
1044 -rgb -fastupsample -quiet -tile -benchtime 0.01 -warmup 0)
1045 set_tests_properties(tjbench-${libtype}-tilem
1046 PROPERTIES DEPENDS tjbench-${libtype}-tilem-cp)
1048 add_test(tjbench-${libtype}-tile-420m-8x8-cmp
1049 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_420M_8x8_TILE}
1050 testout_tilem_420_Q95_8x8.ppm)
1051 add_test(tjbench-${libtype}-tile-422m-8x8-cmp
1052 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_422M_8x8_TILE}
1053 testout_tilem_422_Q95_8x8.ppm)
1054 foreach(tile 16 32 64 128)
1055 foreach(subsamp 420 422)
1056 add_test(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1057 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1058 ${MD5_PPM_${subsamp}M_TILE}
1059 testout_tilem_${subsamp}_Q95_${tile}x${tile}.ppm)
1062 foreach(tile 8 16 32 64 128)
1063 foreach(subsamp 420 422)
1064 set_tests_properties(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1065 PROPERTIES DEPENDS tjbench-${libtype}-tilem)
1070 # These tests are carefully crafted to provide full coverage of as many of
1071 # the underlying algorithms as possible (including all of the
1072 # SIMD-accelerated ones.)
1074 macro(add_bittest PROG NAME ARGS OUTFILE INFILE MD5SUM)
1075 add_test(${PROG}-${libtype}-${NAME}
1076 ${CMAKE_CROSSCOMPILING_EMULATOR} ${PROG}${suffix} ${ARGS}
1077 -outfile ${OUTFILE} ${INFILE})
1078 add_test(${PROG}-${libtype}-${NAME}-cmp
1079 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5SUM} ${OUTFILE})
1080 set_tests_properties(${PROG}-${libtype}-${NAME}-cmp PROPERTIES
1081 DEPENDS ${PROG}-${libtype}-${NAME})
1082 if(${ARGC} GREATER 6)
1083 set(DEPENDS ${ARGN})
1084 set_tests_properties(${PROG}-${libtype}-${NAME} PROPERTIES
1089 # CC: null SAMP: fullsize FDCT: islow ENT: huff
1090 add_bittest(cjpeg rgb-islow "-rgb;-dct;int;-icc;${TESTIMAGES}/test1.icc"
1091 testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm
1092 ${MD5_JPEG_RGB_ISLOW})
1094 # CC: null SAMP: fullsize IDCT: islow ENT: huff
1095 add_bittest(djpeg rgb-islow "-dct;int;-ppm;-icc;testout_rgb_islow.icc"
1096 testout_rgb_islow.ppm testout_rgb_islow.jpg
1097 ${MD5_PPM_RGB_ISLOW} cjpeg-${libtype}-rgb-islow)
1099 add_test(djpeg-${libtype}-rgb-islow-icc-cmp
1100 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1101 b06a39d730129122e85c1363ed1bbc9e testout_rgb_islow.icc)
1102 set_tests_properties(djpeg-${libtype}-rgb-islow-icc-cmp PROPERTIES
1103 DEPENDS djpeg-${libtype}-rgb-islow)
1105 add_bittest(jpegtran icc "-copy;all;-icc;${TESTIMAGES}/test2.icc"
1106 testout_rgb_islow2.jpg testout_rgb_islow.jpg
1107 ${MD5_JPEG_RGB_ISLOW2} cjpeg-${libtype}-rgb-islow)
1110 # CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
1111 add_bittest(djpeg rgb-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1112 testout_rgb_islow_565.bmp testout_rgb_islow.jpg
1113 ${MD5_BMP_RGB_ISLOW_565} cjpeg-${libtype}-rgb-islow)
1115 # CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
1116 add_bittest(djpeg rgb-islow-565D "-dct;int;-rgb565;-bmp"
1117 testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
1118 ${MD5_BMP_RGB_ISLOW_565D} cjpeg-${libtype}-rgb-islow)
1121 # CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
1122 add_bittest(cjpeg 422-ifast-opt "-sample;2x1;-dct;fast;-opt"
1123 testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1124 ${MD5_JPEG_422_IFAST_OPT})
1126 # CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
1127 add_bittest(djpeg 422-ifast "-dct;fast"
1128 testout_422_ifast.ppm testout_422_ifast_opt.jpg
1129 ${MD5_PPM_422_IFAST} cjpeg-${libtype}-422-ifast-opt)
1131 # CC: RGB->YCC SAMP: fullsize/h1v2 FDCT: islow ENT: huff
1132 add_bittest(cjpeg 440-islow "-sample;1x2;-dct;int"
1133 testout_440_islow.jpg ${TESTIMAGES}/testorig.ppm
1134 ${MD5_JPEG_440_ISLOW})
1136 # CC: YCC->RGB SAMP: fullsize/h1v2 fancy IDCT: islow ENT: huff
1137 add_bittest(djpeg 440-islow "-dct;int"
1138 testout_440_islow.ppm testout_440_islow.jpg
1139 ${MD5_PPM_440_ISLOW} cjpeg-${libtype}-440-islow)
1141 # CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
1142 add_bittest(djpeg 422m-ifast "-dct;fast;-nosmooth"
1143 testout_422m_ifast.ppm testout_422_ifast_opt.jpg
1144 ${MD5_PPM_422M_IFAST} cjpeg-${libtype}-422-ifast-opt)
1147 # CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
1148 add_bittest(djpeg 422m-ifast-565
1149 "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1150 testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
1151 ${MD5_BMP_422M_IFAST_565} cjpeg-${libtype}-422-ifast-opt)
1153 # CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
1154 add_bittest(djpeg 422m-ifast-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1155 testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
1156 ${MD5_BMP_422M_IFAST_565D} cjpeg-${libtype}-422-ifast-opt)
1159 # CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
1160 add_bittest(cjpeg 420-q100-ifast-prog
1161 "-sample;2x2;-quality;100;-dct;fast;-scans;${TESTIMAGES}/test.scan"
1162 testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1163 ${MD5_JPEG_420_IFAST_Q100_PROG})
1165 # CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
1166 add_bittest(djpeg 420-q100-ifast-prog "-dct;fast"
1167 testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1168 ${MD5_PPM_420_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1170 # CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
1171 add_bittest(djpeg 420m-q100-ifast-prog "-dct;fast;-nosmooth"
1172 testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1173 ${MD5_PPM_420M_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1175 # CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
1176 add_bittest(cjpeg gray-islow "-gray;-dct;int"
1177 testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm
1178 ${MD5_JPEG_GRAY_ISLOW})
1180 # CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
1181 add_bittest(djpeg gray-islow "-dct;int"
1182 testout_gray_islow.ppm testout_gray_islow.jpg
1183 ${MD5_PPM_GRAY_ISLOW} cjpeg-${libtype}-gray-islow)
1185 # CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
1186 add_bittest(djpeg gray-islow-rgb "-dct;int;-rgb"
1187 testout_gray_islow_rgb.ppm testout_gray_islow.jpg
1188 ${MD5_PPM_GRAY_ISLOW_RGB} cjpeg-${libtype}-gray-islow)
1191 # CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
1192 add_bittest(djpeg gray-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1193 testout_gray_islow_565.bmp testout_gray_islow.jpg
1194 ${MD5_BMP_GRAY_ISLOW_565} cjpeg-${libtype}-gray-islow)
1196 # CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
1197 add_bittest(djpeg gray-islow-565D "-dct;int;-rgb565;-bmp"
1198 testout_gray_islow_565D.bmp testout_gray_islow.jpg
1199 ${MD5_BMP_GRAY_ISLOW_565D} cjpeg-${libtype}-gray-islow)
1202 # CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
1204 add_bittest(cjpeg 420s-ifast-opt "-sample;2x2;-smooth;1;-dct;int;-opt"
1205 testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1206 ${MD5_JPEG_420S_IFAST_OPT})
1209 # CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
1210 add_bittest(cjpeg 3x2-float-prog "-sample;3x2;-dct;float;-prog"
1211 testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm
1212 ${MD5_JPEG_3x2_FLOAT_PROG_${FLOATTEST_UC}})
1214 # CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
1215 add_bittest(djpeg 3x2-float-prog "-dct;float"
1216 testout_3x2_float.ppm testout_3x2_float_prog.jpg
1217 ${MD5_PPM_3x2_FLOAT_${FLOATTEST_UC}} cjpeg-${libtype}-3x2-float-prog)
1220 # CC: RGB->YCC SAMP: fullsize/int FDCT: ifast ENT: prog huff
1221 add_bittest(cjpeg 3x2-ifast-prog "-sample;3x2;-dct;fast;-prog"
1222 testout_3x2_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1223 ${MD5_JPEG_3x2_IFAST_PROG})
1225 # CC: YCC->RGB SAMP: fullsize/int IDCT: ifast ENT: prog huff
1226 add_bittest(djpeg 3x2-ifast-prog "-dct;fast"
1227 testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
1228 ${MD5_PPM_3x2_IFAST} cjpeg-${libtype}-3x2-ifast-prog)
1231 # CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
1232 add_bittest(cjpeg 420-islow-ari "-dct;int;-arithmetic"
1233 testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm
1234 ${MD5_JPEG_420_ISLOW_ARI})
1236 add_bittest(jpegtran 420-islow-ari "-arithmetic"
1237 testout_420_islow_ari2.jpg ${TESTIMAGES}/testimgint.jpg
1238 ${MD5_JPEG_420_ISLOW_ARI})
1240 # CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
1241 add_bittest(cjpeg 444-islow-progari
1242 "-sample;1x1;-dct;int;-prog;-arithmetic"
1243 testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm
1244 ${MD5_JPEG_444_ISLOW_PROGARI})
1248 # CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
1249 add_bittest(djpeg 420m-ifast-ari "-fast;-skip;1,20;-ppm"
1250 testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
1251 ${MD5_PPM_420M_IFAST_ARI})
1253 add_bittest(jpegtran 420-islow ""
1254 testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg
1255 ${MD5_JPEG_420_ISLOW})
1258 # 2/1-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
1259 # 15/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
1260 # 13/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
1261 # 11/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
1262 # 9/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
1263 # 7/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow
1265 # 3/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow
1267 # 5/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow
1269 # 1/2-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow
1271 # 3/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow
1273 # 1/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow
1275 # 1/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow
1277 foreach(scale 2_1 15_8 13_8 11_8 9_8 7_8 3_4 5_8 1_2 3_8 1_4 1_8)
1278 string(REGEX REPLACE "_" "/" scalearg ${scale})
1279 add_bittest(djpeg 420m-islow-${scale}
1280 "-dct;int;-scale;${scalearg};-nosmooth;-ppm"
1281 testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG}
1282 ${MD5_PPM_420M_ISLOW_${scale}})
1286 # CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
1287 add_bittest(djpeg 420-islow-256 "-dct;int;-colors;256;-bmp"
1288 testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG}
1289 ${MD5_BMP_420_ISLOW_256})
1291 # CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
1292 add_bittest(djpeg 420-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1293 testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1294 ${MD5_BMP_420_ISLOW_565})
1296 # CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
1297 add_bittest(djpeg 420-islow-565D "-dct;int;-rgb565;-bmp"
1298 testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1299 ${MD5_BMP_420_ISLOW_565D})
1301 # CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
1302 add_bittest(djpeg 420m-islow-565
1303 "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1304 testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1305 ${MD5_BMP_420M_ISLOW_565})
1307 # CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
1308 add_bittest(djpeg 420m-islow-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1309 testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1310 ${MD5_BMP_420M_ISLOW_565D})
1313 # Partial decode tests. These tests are designed to cover all of the
1314 # possible code paths in jpeg_skip_scanlines().
1316 # Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
1317 add_bittest(djpeg 420-islow-skip15_31 "-dct;int;-skip;15,31;-ppm"
1318 testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG}
1319 ${MD5_PPM_420_ISLOW_SKIP15_31})
1321 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
1323 add_bittest(djpeg 420-islow-ari-skip16_139 "-dct;int;-skip;16,139;-ppm"
1324 testout_420_islow_ari_skip16,139.ppm ${TESTIMAGES}/testimgari.jpg
1325 ${MD5_PPM_420_ISLOW_ARI_SKIP16_139})
1328 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
1329 add_test(cjpeg-${libtype}-420-islow-prog
1330 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog
1331 -outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1332 add_bittest(djpeg 420-islow-prog-crop62x62_71_71
1333 "-dct;int;-crop;62x62+71+71;-ppm"
1334 testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
1335 ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71} cjpeg-${libtype}-420-islow-prog)
1337 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
1339 add_bittest(djpeg 420-islow-ari-crop53x53_4_4
1340 "-dct;int;-crop;53x53+4+4;-ppm"
1341 testout_420_islow_ari_crop53x53,4,4.ppm ${TESTIMAGES}/testimgari.jpg
1342 ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4})
1345 # Context rows: No Intra-iMCU row: Yes ENT: huff
1346 add_test(cjpeg-${libtype}-444-islow
1347 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -sample 1x1
1348 -outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
1349 add_bittest(djpeg 444-islow-skip1_6 "-dct;int;-skip;1,6;-ppm"
1350 testout_444_islow_skip1,6.ppm testout_444_islow.jpg
1351 ${MD5_PPM_444_ISLOW_SKIP1_6} cjpeg-${libtype}-444-islow)
1353 # Context rows: No Intra-iMCU row: No ENT: prog huff
1354 add_test(cjpeg-${libtype}-444-islow-prog
1355 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog -sample 1x1
1356 -outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1357 add_bittest(djpeg 444-islow-prog-crop98x98_13_13
1358 "-dct;int;-crop;98x98+13+13;-ppm"
1359 testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
1360 ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13} cjpeg-${libtype}-444-islow-prog)
1362 # Context rows: No Intra-iMCU row: No ENT: arith
1364 add_test(cjpeg-${libtype}-444-islow-ari
1365 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -arithmetic
1366 -sample 1x1 -outfile testout_444_islow_ari.jpg
1367 ${TESTIMAGES}/testorig.ppm)
1369 add_bittest(djpeg 444-islow-ari-crop37x37_0_0
1370 "-dct;int;-crop;37x37+0+0;-ppm"
1371 testout_444_islow_ari_crop37x37,0,0.ppm testout_444_islow_ari.jpg
1372 ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0} cjpeg-${libtype}-444-islow-ari)
1376 add_bittest(jpegtran crop "-crop;120x90+20+50;-transpose;-perfect"
1377 testout_crop.jpg ${TESTIMAGES}/${TESTORIG}
1382 add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
1383 ${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/testclean.cmake)
1385 configure_file(croptest.in croptest @ONLY)
1386 add_custom_target(croptest
1387 COMMAND echo croptest
1388 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/croptest)
1391 configure_file(tjbenchtest.in tjbenchtest @ONLY)
1392 configure_file(tjexampletest.in tjexampletest @ONLY)
1397 configure_file(tjbenchtest.java.in tjbenchtest.java @ONLY)
1398 configure_file(tjexampletest.java.in tjexampletest.java @ONLY)
1399 add_custom_target(tjtest
1400 COMMAND echo tjbenchtest
1401 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1402 COMMAND echo tjbenchtest -alloc
1403 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1404 COMMAND echo tjbenchtest -yuv
1405 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1406 COMMAND echo tjbenchtest -yuv -alloc
1407 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1408 COMMAND echo tjbenchtest -progressive
1409 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1410 COMMAND echo tjbenchtest -progressive -yuv
1411 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1412 COMMAND echo tjexampletest
1413 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1414 COMMAND echo tjbenchtest.java
1415 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1416 COMMAND echo tjbenchtest.java -yuv
1417 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -yuv
1418 COMMAND echo tjbenchtest.java -progressive
1419 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -progressive
1420 COMMAND echo tjexampletest.java -progressive -yuv
1421 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1423 COMMAND echo tjexampletest.java
1424 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest.java
1425 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1426 ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1427 ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest)
1429 add_custom_target(tjtest
1430 COMMAND echo tjbenchtest
1431 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1432 COMMAND echo tjbenchtest -alloc
1433 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1434 COMMAND echo tjbenchtest -yuv
1435 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1436 COMMAND echo tjbenchtest -yuv -alloc
1437 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1438 COMMAND echo tjbenchtest -progressive
1439 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1440 COMMAND echo tjbenchtest -progressive -yuv
1441 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1442 COMMAND echo tjexampletest
1443 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1444 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest)
1449 ###############################################################################
1451 ###############################################################################
1453 set(EXE ${CMAKE_EXECUTABLE_SUFFIX})
1457 install(TARGETS turbojpeg EXPORT ${CMAKE_PROJECT_NAME}Targets
1458 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
1459 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1460 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1461 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1462 install(TARGETS tjbench
1463 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1464 if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
1465 CMAKE_C_LINKER_SUPPORTS_PDB)
1466 install(FILES "$<TARGET_PDB_FILE:turbojpeg>"
1467 DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
1471 install(TARGETS turbojpeg-static EXPORT ${CMAKE_PROJECT_NAME}Targets
1472 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
1473 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
1474 if(NOT ENABLE_SHARED)
1475 if(MSVC_IDE OR XCODE)
1476 set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1478 set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1480 install(PROGRAMS ${DIR}/tjbench-static${EXE}
1481 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME tjbench${EXE})
1484 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg.h
1485 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1489 install(TARGETS jpeg-static EXPORT ${CMAKE_PROJECT_NAME}Targets
1490 INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
1491 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
1492 if(NOT ENABLE_SHARED)
1493 if(MSVC_IDE OR XCODE)
1494 set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1496 set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1498 install(PROGRAMS ${DIR}/cjpeg-static${EXE}
1499 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME cjpeg${EXE})
1500 install(PROGRAMS ${DIR}/djpeg-static${EXE}
1501 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME djpeg${EXE})
1502 install(PROGRAMS ${DIR}/jpegtran-static${EXE}
1503 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME jpegtran${EXE})
1507 install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1509 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.ijg
1510 ${CMAKE_CURRENT_SOURCE_DIR}/README.md ${CMAKE_CURRENT_SOURCE_DIR}/example.txt
1511 ${CMAKE_CURRENT_SOURCE_DIR}/tjexample.c
1512 ${CMAKE_CURRENT_SOURCE_DIR}/libjpeg.txt
1513 ${CMAKE_CURRENT_SOURCE_DIR}/structure.txt
1514 ${CMAKE_CURRENT_SOURCE_DIR}/usage.txt ${CMAKE_CURRENT_SOURCE_DIR}/wizard.txt
1515 ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
1517 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/java/TJExample.java
1518 DESTINATION ${CMAKE_INSTALL_DOCDIR})
1522 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cjpeg.1
1523 ${CMAKE_CURRENT_SOURCE_DIR}/djpeg.1 ${CMAKE_CURRENT_SOURCE_DIR}/jpegtran.1
1524 ${CMAKE_CURRENT_SOURCE_DIR}/rdjpgcom.1
1525 ${CMAKE_CURRENT_SOURCE_DIR}/wrjpgcom.1
1526 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
1528 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libjpeg.pc
1529 ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libturbojpeg.pc
1530 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
1532 ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/${CMAKE_PROJECT_NAME}Config.cmake
1533 ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/${CMAKE_PROJECT_NAME}ConfigVersion.cmake
1534 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
1535 install(EXPORT ${CMAKE_PROJECT_NAME}Targets
1536 NAMESPACE ${CMAKE_PROJECT_NAME}::
1537 DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${CMAKE_PROJECT_NAME})
1539 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h
1540 ${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h
1541 ${CMAKE_CURRENT_SOURCE_DIR}/jpeglib.h
1542 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1544 include(cmakescripts/BuildPackages.cmake)
1546 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/cmake_uninstall.cmake.in"
1547 "cmake_uninstall.cmake" IMMEDIATE @ONLY)
1549 add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P cmake_uninstall.cmake)