1 cmake_minimum_required(VERSION 2.8.12)
3 if(CMAKE_EXECUTABLE_SUFFIX)
4 set(CMAKE_EXECUTABLE_SUFFIX_TMP ${CMAKE_EXECUTABLE_SUFFIX})
7 project(libjpeg-turbo C)
9 string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
10 list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
11 list(GET VERSION_TRIPLET 1 VERSION_MINOR)
12 list(GET VERSION_TRIPLET 2 VERSION_REVISION)
13 function(pad_number NUMBER OUTPUT_LEN)
14 string(LENGTH "${${NUMBER}}" INPUT_LEN)
15 if(INPUT_LEN LESS OUTPUT_LEN)
16 math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
18 foreach(C RANGE ${ZEROES})
21 set(${NUMBER} ${NUM} PARENT_SCOPE)
24 pad_number(VERSION_MINOR 3)
25 pad_number(VERSION_REVISION 3)
26 set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
28 string(TIMESTAMP DEFAULT_BUILD "%Y%m%d")
29 set(BUILD ${DEFAULT_BUILD} CACHE STRING "Build string (default: ${DEFAULT_BUILD})")
31 # NOTE: On Windows, this does nothing except when using MinGW or Cygwin.
32 # CMAKE_BUILD_TYPE has no meaning in Visual Studio, and it always defaults to
33 # Debug when using NMake.
34 if(NOT CMAKE_BUILD_TYPE)
35 set(CMAKE_BUILD_TYPE Release)
37 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
39 message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
41 # Detect CPU type and whether we're building 64-bit or 32-bit code
42 math(EXPR BITS "${CMAKE_SIZEOF_VOID_P} * 8")
43 string(TOLOWER ${CMAKE_SYSTEM_PROCESSOR} CMAKE_SYSTEM_PROCESSOR_LC)
44 if(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86_64" OR
45 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "amd64" OR
46 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "i[0-9]86" OR
47 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "x86" OR
48 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ia32")
54 if(NOT CMAKE_SYSTEM_PROCESSOR STREQUAL ${CPU_TYPE})
55 set(CMAKE_SYSTEM_PROCESSOR ${CPU_TYPE})
57 elseif(CMAKE_SYSTEM_PROCESSOR_LC STREQUAL "aarch64" OR
58 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "arm*")
64 elseif(CMAKE_SYSTEM_PROCESSOR_LC MATCHES "ppc*" OR
65 CMAKE_SYSTEM_PROCESSOR_LC MATCHES "powerpc*")
68 set(CPU_TYPE ${CMAKE_SYSTEM_PROCESSOR_LC})
70 message(STATUS "${BITS}-bit build (${CPU_TYPE})")
73 ###############################################################################
75 ###############################################################################
79 set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}")
81 set(CMAKE_INSTALL_DEFAULT_PREFIX "c:/${CMAKE_PROJECT_NAME}-gcc")
84 set(CMAKE_INSTALL_DEFAULT_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}64")
87 set(CMAKE_INSTALL_DEFAULT_PREFIX /opt/${CMAKE_PROJECT_NAME})
89 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
90 set(CMAKE_INSTALL_PREFIX "${CMAKE_INSTALL_DEFAULT_PREFIX}" CACHE PATH
91 "Directory into which to install ${CMAKE_PROJECT_NAME} (default: ${CMAKE_INSTALL_DEFAULT_PREFIX})"
94 message(STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
96 # When the prefix is /opt/${CMAKE_PROJECT_NAME}, we assume that an "official"
97 # build is being created, and thus we install things into specific locations.
99 if(CMAKE_INSTALL_PREFIX STREQUAL "${CMAKE_INSTALL_DEFAULT_PREFIX}")
100 set(CMAKE_INSTALL_DEFAULT_DATAROOTDIR "")
101 set(CMAKE_INSTALL_DEFAULT_DOCDIR "<CMAKE_INSTALL_DATAROOTDIR>/doc")
102 set(CMAKE_INSTALL_DEFAULT_JAVADIR "<CMAKE_INSTALL_DATAROOTDIR>/classes")
103 if(UNIX AND NOT APPLE)
105 set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib64")
107 set(CMAKE_INSTALL_DEFAULT_LIBDIR "lib32")
112 include(cmakescripts/GNUInstallDirs.cmake)
114 macro(report_directory var)
115 if(CMAKE_INSTALL_${var} STREQUAL CMAKE_INSTALL_FULL_${var})
116 message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}}")
118 message(STATUS "CMAKE_INSTALL_${var} = ${CMAKE_INSTALL_${var}} (${CMAKE_INSTALL_FULL_${var}})")
120 mark_as_advanced(CLEAR CMAKE_INSTALL_${var})
123 set(DIRLIST "BINDIR;DATAROOTDIR;DOCDIR;INCLUDEDIR;LIBDIR")
125 list(APPEND DIRLIST "MANDIR")
127 foreach(dir ${DIRLIST})
128 report_directory(${dir})
132 ###############################################################################
133 # CONFIGURATION OPTIONS
134 ###############################################################################
136 macro(boolean_number var)
144 option(ENABLE_SHARED "Build shared libraries" TRUE)
145 boolean_number(ENABLE_SHARED)
146 option(ENABLE_STATIC "Build static libraries" TRUE)
147 boolean_number(ENABLE_STATIC)
148 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)
149 boolean_number(REQUIRE_SIMD)
150 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)
151 boolean_number(WITH_12BIT)
152 option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
153 boolean_number(WITH_ARITH_DEC)
154 option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
155 boolean_number(WITH_ARITH_ENC)
156 option(WITH_JAVA "Build Java wrapper for the TurboJPEG API library (implies ENABLE_SHARED=1)" FALSE)
157 boolean_number(WITH_JAVA)
158 option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
159 boolean_number(WITH_JPEG7)
160 option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes ${CMAKE_PROJECT_NAME} backward-incompatible with libjpeg v6b)" FALSE)
161 boolean_number(WITH_JPEG8)
162 option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
163 boolean_number(WITH_MEM_SRCDST)
164 option(WITH_SIMD "Include SIMD extensions, if available for this platform" TRUE)
165 boolean_number(WITH_SIMD)
166 option(WITH_TURBOJPEG "Include the TurboJPEG API library and associated test programs" TRUE)
167 boolean_number(WITH_TURBOJPEG)
168 option(ENABLE_COLOR_PICKER "Enable color picker for product TV" FALSE)
169 boolean_number(ENABLE_COLOR_PICKER)
171 macro(report_option var desc)
173 message(STATUS "${desc} enabled (${var} = ${${var}})")
175 message(STATUS "${desc} disabled (${var} = ${${var}})")
183 # Explicitly setting CMAKE_POSITION_INDEPENDENT_CODE=FALSE disables PIC for all
184 # targets, which will cause the shared library builds to fail. Thus, if shared
185 # libraries are enabled and CMAKE_POSITION_INDEPENDENT_CODE is explicitly set
186 # to FALSE, we need to unset it, thus restoring the default behavior
187 # (automatically using PIC for shared library targets.)
188 if(DEFINED CMAKE_POSITION_INDEPENDENT_CODE AND
189 NOT CMAKE_POSITION_INDEPENDENT_CODE AND ENABLE_SHARED)
190 unset(CMAKE_POSITION_INDEPENDENT_CODE CACHE)
193 report_option(ENABLE_SHARED "Shared libraries")
194 report_option(ENABLE_STATIC "Static libraries")
197 set(CMAKE_INSTALL_RPATH ${CMAKE_INSTALL_FULL_LIBDIR})
200 if(WITH_JPEG8 OR WITH_JPEG7)
201 set(WITH_ARITH_ENC 1)
202 set(WITH_ARITH_DEC 1)
205 set(WITH_MEM_SRCDST 0)
209 set(WITH_ARITH_DEC 0)
210 set(WITH_ARITH_ENC 0)
213 set(WITH_TURBOJPEG 0)
214 set(BITS_IN_JSAMPLE 12)
216 set(BITS_IN_JSAMPLE 8)
218 report_option(WITH_12BIT "12-bit JPEG support")
221 set(D_ARITH_CODING_SUPPORTED 1)
224 report_option(WITH_ARITH_DEC "Arithmetic decoding support")
228 set(C_ARITH_CODING_SUPPORTED 1)
231 report_option(WITH_ARITH_ENC "Arithmetic encoding support")
235 report_option(WITH_TURBOJPEG "TurboJPEG API library")
236 report_option(WITH_JAVA "TurboJPEG Java wrapper")
240 set(MEM_SRCDST_SUPPORTED 1)
241 set(MEM_SRCDST_FUNCTIONS "global: jpeg_mem_dest; jpeg_mem_src;")
244 report_option(WITH_MEM_SRCDST "In-memory source/destination managers")
253 set(JPEG_LIB_VERSION 80)
255 set(JPEG_LIB_VERSION 70)
257 set(JPEG_LIB_VERSION 62)
260 if(ENABLE_COLOR_PICKER)
261 set(COLOR_PICKER_ENABLE 1)
263 set(COLOR_PICKER_ENABLE 0)
266 math(EXPR JPEG_LIB_VERSION_DIV10 "${JPEG_LIB_VERSION} / 10")
267 math(EXPR JPEG_LIB_VERSION_MOD10 "${JPEG_LIB_VERSION} % 10")
268 if(JPEG_LIB_VERSION STREQUAL "62")
269 set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION})
271 set(DEFAULT_SO_MAJOR_VERSION ${JPEG_LIB_VERSION_DIV10})
273 if(JPEG_LIB_VERSION STREQUAL "80")
274 set(DEFAULT_SO_MINOR_VERSION 2)
276 set(DEFAULT_SO_MINOR_VERSION 0)
279 # This causes SO_MAJOR_VERSION/SO_MINOR_VERSION to reset to defaults if
280 # WITH_JPEG7 or WITH_JPEG8 has changed.
281 if((DEFINED WITH_JPEG7_INT AND NOT WITH_JPEG7 EQUAL WITH_JPEG7_INT) OR
282 (DEFINED WITH_JPEG8_INT AND NOT WITH_JPEG8 EQUAL WITH_JPEG8_INT))
283 set(FORCE_SO_VERSION "FORCE")
285 set(WITH_JPEG7_INT ${WITH_JPEG7} CACHE INTERNAL "")
286 set(WITH_JPEG8_INT ${WITH_JPEG8} CACHE INTERNAL "")
288 set(SO_MAJOR_VERSION ${DEFAULT_SO_MAJOR_VERSION} CACHE STRING
289 "Major version of the libjpeg API shared library (default: ${DEFAULT_SO_MAJOR_VERSION})"
291 set(SO_MINOR_VERSION ${DEFAULT_SO_MINOR_VERSION} CACHE STRING
292 "Minor version of the libjpeg API shared library (default: ${DEFAULT_SO_MINOR_VERSION})"
295 set(JPEG_LIB_VERSION_DECIMAL "${JPEG_LIB_VERSION_DIV10}.${JPEG_LIB_VERSION_MOD10}")
296 message(STATUS "Emulating libjpeg API/ABI v${JPEG_LIB_VERSION_DECIMAL} (WITH_JPEG7 = ${WITH_JPEG7}, WITH_JPEG8 = ${WITH_JPEG8})")
297 message(STATUS "libjpeg API shared library version = ${SO_MAJOR_VERSION}.${SO_AGE}.${SO_MINOR_VERSION}")
299 # Because the TurboJPEG API library uses versioned symbols and changes the
300 # names of functions whenever they are modified in a backward-incompatible
301 # manner, it is always backward-ABI-compatible with itself, so the major and
302 # minor SO versions don't change. However, we increase the middle number (the
303 # SO "age") whenever functions are added to the API.
304 set(TURBOJPEG_SO_MAJOR_VERSION 0)
305 set(TURBOJPEG_SO_VERSION 0.2.0)
308 ###############################################################################
310 ###############################################################################
314 "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."
317 # Use the static C library for all build types
318 foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
319 CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
320 if(${var} MATCHES "/MD")
321 string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
325 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W3 /wd4996")
328 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
329 # Use the maximum optimization level for release builds
330 foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
331 if(${var} MATCHES "-O2")
332 string(REGEX REPLACE "-O2" "-O3" ${var} "${${var}}")
337 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
338 if(CMAKE_C_COMPILER_ID MATCHES "SunPro")
339 # Use the maximum optimization level for release builds
340 foreach(var CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_RELWITHDEBINFO)
341 if(${var} MATCHES "-xO3")
342 string(REGEX REPLACE "-xO3" "-xO5" ${var} "${${var}}")
344 if(${var} MATCHES "-xO2")
345 string(REGEX REPLACE "-xO2" "-xO5" ${var} "${${var}}")
351 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
353 set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
354 message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
356 set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
357 message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
359 include(CheckCSourceCompiles)
360 include(CheckIncludeFiles)
361 include(CheckTypeSize)
363 check_type_size("size_t" SIZE_T)
364 check_type_size("unsigned long" UNSIGNED_LONG)
366 if(SIZE_T EQUAL UNSIGNED_LONG)
367 check_c_source_compiles("int main(int argc, char **argv) { unsigned long a = argc; return __builtin_ctzl(a); }"
371 check_include_files("intrin.h" HAVE_INTRIN_H)
376 check_include_files(locale.h HAVE_LOCALE_H)
377 check_include_files(stddef.h HAVE_STDDEF_H)
378 check_include_files(stdlib.h HAVE_STDLIB_H)
379 check_include_files(sys/types.h NEED_SYS_TYPES_H)
381 # Check for functions
382 include(CheckSymbolExists)
383 check_symbol_exists(memset string.h HAVE_MEMSET)
384 check_symbol_exists(memcpy string.h HAVE_MEMCPY)
385 if(NOT HAVE_MEMSET AND NOT HAVE_MEMCPY)
386 set(NEED_BSD_STRINGS 1)
390 check_type_size("unsigned char" UNSIGNED_CHAR)
391 check_type_size("unsigned short" UNSIGNED_SHORT)
393 # Check for compiler features
394 check_c_source_compiles("int main(void) { typedef struct undefined_structure *undef_struct_ptr; undef_struct_ptr ptr = 0; return ptr != 0; }"
397 message(STATUS "Compiler supports pointers to undefined structures.")
399 set(INCOMPLETE_TYPES_BROKEN 1)
400 message(STATUS "Compiler does not support pointers to undefined structures.")
403 if(CMAKE_CROSSCOMPILING)
404 set(RIGHT_SHIFT_IS_UNSIGNED 0)
406 include(CheckCSourceRuns)
407 check_c_source_runs("
410 int is_shifting_signed (long arg) {
412 if (res == -0x7F7E80CL)
413 return 1; /* right shift is signed */
414 /* see if unsigned-shift hack will fix it. */
415 /* we can't just test exact value since it depends on width of long... */
416 res |= (~0L) << (32-4);
417 if (res == -0x7F7E80CL)
418 return 0; /* right shift is unsigned */
419 printf(\"Right shift isn't acting as I expect it to.\\\\n\");
420 printf(\"I fear the JPEG software will not work at all.\\\\n\\\\n\");
421 return 0; /* try it with unsigned anyway */
424 exit(is_shifting_signed(-0x7F7E80B1L));
425 }" RIGHT_SHIFT_IS_UNSIGNED)
428 if(CMAKE_CROSSCOMPILING)
429 set(__CHAR_UNSIGNED__ 0)
431 check_c_source_runs("int main(void) { return ((char) -1 < 0); }"
437 set(INLINE_OPTIONS "__inline;inline")
439 set(INLINE_OPTIONS "__inline__;inline")
441 option(FORCE_INLINE "Force function inlining" TRUE)
442 boolean_number(FORCE_INLINE)
445 list(INSERT INLINE_OPTIONS 0 "__forceinline")
447 list(INSERT INLINE_OPTIONS 0 "inline __attribute__((always_inline))")
448 list(INSERT INLINE_OPTIONS 0 "__inline__ __attribute__((always_inline))")
451 foreach(inline ${INLINE_OPTIONS})
452 check_c_source_compiles("${inline} static int foo(void) { return 0; } int main(void) { return foo(); }"
455 set(INLINE ${inline})
460 message(FATAL_ERROR "Could not determine how to inline functions.")
462 message(STATUS "INLINE = ${INLINE} (FORCE_INLINE = ${FORCE_INLINE})")
466 set(THREAD_LOCAL "__declspec(thread)")
468 set(THREAD_LOCAL "__thread")
470 check_c_source_compiles("${THREAD_LOCAL} int i; int main(void) { i = 0; return i; }" HAVE_THREAD_LOCAL)
471 if(HAVE_THREAD_LOCAL)
472 message(STATUS "THREAD_LOCAL = ${THREAD_LOCAL}")
474 message(WARNING "Thread-local storage is not available. The TurboJPEG API library's global error handler will not be thread-safe.")
479 if(UNIX AND NOT APPLE)
480 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map "VERS_1 { global: *; };")
481 set(CMAKE_REQUIRED_FLAGS
482 "-Wl,--version-script,${CMAKE_CURRENT_BINARY_DIR}/conftest.map")
483 check_c_source_compiles("int main(void) { return 0; }" HAVE_VERSION_SCRIPT)
484 set(CMAKE_REQUIRED_FLAGS)
485 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
486 if(HAVE_VERSION_SCRIPT)
487 message(STATUS "Linker supports GNU-style version scripts")
488 set(MAPFLAG "-Wl,--version-script,")
489 set(TJMAPFLAG "-Wl,--version-script,")
491 message(STATUS "Linker does not support GNU-style version scripts")
492 if(CMAKE_SYSTEM_NAME STREQUAL "SunOS")
493 # The Solaris linker doesn't like our version script for the libjpeg API
494 # library, but the version script for the TurboJPEG API library should
496 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map
497 "VERS_1 { global: foo; local: *; }; VERS_2 { global: foo2; } VERS_1;")
498 set(CMAKE_REQUIRED_FLAGS "-Wl,-M,${CMAKE_CURRENT_BINARY_DIR}/conftest.map -shared")
499 check_c_source_compiles("int foo() { return 0; } int foo2() { return 2; }"
501 set(CMAKE_REQUIRED_FLAGS)
502 file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/conftest.map)
504 message(STATUS "Linker supports mapfiles")
505 set(TJMAPFLAG "-Wl,-M,")
507 message(STATUS "Linker does not support mapfiles")
515 configure_file(win/jconfig.h.in jconfig.h)
517 configure_file(jconfig.h.in jconfig.h)
519 configure_file(jconfigint.h.in jconfigint.h)
521 configure_file(libjpeg.map.in libjpeg.map)
524 # Include directories and compiler definitions
525 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
528 ###############################################################################
530 ###############################################################################
532 if(CMAKE_EXECUTABLE_SUFFIX_TMP)
533 set(CMAKE_EXECUTABLE_SUFFIX ${CMAKE_EXECUTABLE_SUFFIX_TMP})
535 message(STATUS "CMAKE_EXECUTABLE_SUFFIX = ${CMAKE_EXECUTABLE_SUFFIX}")
537 set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
538 jcicc.c jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c
539 jcphuff.c jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c
540 jdatasrc.c jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdicc.c jdinput.c
541 jdmainct.c jdmarker.c jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c
542 jdtrans.c jerror.c jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c
543 jidctint.c jidctred.c jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
545 if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
546 set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
550 set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
554 set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
558 add_subdirectory(simd)
559 elseif(NOT WITH_12BIT)
560 message(STATUS "SIMD extensions: None (WITH_SIMD = ${WITH_SIMD})")
563 message(STATUS "SIMD extensions: ${CPU_TYPE} (WITH_SIMD = ${WITH_SIMD})")
564 if(MSVC_IDE OR XCODE)
565 set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
568 add_library(simd OBJECT jsimd_none.c)
572 add_subdirectory(java)
576 add_subdirectory(sharedlib)
580 add_library(jpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
583 set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
589 set(TURBOJPEG_SOURCES ${JPEG_SOURCES} $<TARGET_OBJECTS:simd> ${SIMD_OBJS}
590 turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c rdppm.c
592 set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile)
594 set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
595 include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
596 set(TJMAPFILE ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg-mapfile.jni)
598 add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
599 set_property(TARGET turbojpeg PROPERTY COMPILE_FLAGS
600 "-DBMP_SUPPORTED -DPPM_SUPPORTED")
602 set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
605 set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
607 if(APPLE AND (NOT CMAKE_OSX_DEPLOYMENT_TARGET OR
608 CMAKE_OSX_DEPLOYMENT_TARGET VERSION_GREATER 10.4))
609 if(NOT CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG)
610 set(CMAKE_SHARED_LIBRARY_RUNTIME_C_FLAG "-Wl,-rpath,")
612 set_target_properties(turbojpeg PROPERTIES MACOSX_RPATH 1)
614 set_target_properties(turbojpeg PROPERTIES
615 SOVERSION ${TURBOJPEG_SO_MAJOR_VERSION} VERSION ${TURBOJPEG_SO_VERSION})
617 set_target_properties(turbojpeg PROPERTIES
618 LINK_FLAGS "${TJMAPFLAG}${TJMAPFILE}")
621 add_executable(tjunittest tjunittest.c tjutil.c md5/md5.c md5/md5hl.c)
622 target_link_libraries(tjunittest turbojpeg)
624 add_executable(tjbench tjbench.c tjutil.c)
625 target_link_libraries(tjbench turbojpeg)
627 target_link_libraries(tjbench m)
630 add_executable(tjexample tjexample.c)
631 target_link_libraries(tjexample turbojpeg)
635 add_library(turbojpeg-static STATIC ${JPEG_SOURCES} $<TARGET_OBJECTS:simd>
636 ${SIMD_OBJS} turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c rdbmp.c
637 rdppm.c wrbmp.c wrppm.c)
638 set_property(TARGET turbojpeg-static PROPERTY COMPILE_FLAGS
639 "-DBMP_SUPPORTED -DPPM_SUPPORTED")
641 set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
644 add_executable(tjunittest-static tjunittest.c tjutil.c md5/md5.c
646 target_link_libraries(tjunittest-static turbojpeg-static)
648 add_executable(tjbench-static tjbench.c tjutil.c)
649 target_link_libraries(tjbench-static turbojpeg-static)
651 target_link_libraries(tjbench-static m)
657 set(USE_SETMODE "-DUSE_SETMODE")
660 set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED ${USE_SETMODE}")
662 set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED ${USE_SETMODE}")
663 set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
664 set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
668 add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
669 ${CJPEG_BMP_SOURCES})
670 set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
671 target_link_libraries(cjpeg-static jpeg-static)
673 add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
674 wrppm.c ${DJPEG_BMP_SOURCES})
675 set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
676 target_link_libraries(djpeg-static jpeg-static)
678 add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
679 target_link_libraries(jpegtran-static jpeg-static)
680 set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "${USE_SETMODE}")
683 add_executable(rdjpgcom rdjpgcom.c)
685 add_executable(wrjpgcom wrjpgcom.c)
688 ###############################################################################
690 ###############################################################################
692 add_subdirectory(md5)
694 if(MSVC_IDE OR XCODE)
695 set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
703 set(TESTORIG testorig12.jpg)
704 set(MD5_JPEG_RGB_ISLOW 9d7369207c520d37f2c1cbfcb82b2964)
705 set(MD5_JPEG_RGB_ISLOW2 a00bd20d8ae49684640ef7177d2e0b64)
706 set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
707 set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
708 set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
709 set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
710 set(MD5_JPEG_420_IFAST_Q100_PROG 008ab68d6ddbba04a8f01deee4e0f9f8)
711 set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
712 set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
713 set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
714 set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
715 set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
716 set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
718 set(MD5_JPEG_3x2_FLOAT_PROG_SSE a8c17daf77b457725ec929e215b603f8)
719 set(MD5_PPM_3x2_FLOAT_SSE 42876ab9e5c2f76a87d08db5fbd57956)
720 set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT a8c17daf77b457725ec929e215b603f8)
721 set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
722 set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
723 ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
724 set(MD5_PPM_3x2_FLOAT_FP_CONTRACT ${MD5_PPM_3x2_FLOAT_SSE})
725 set(MD5_JPEG_3x2_FLOAT_PROG_387 bc6dbbefac2872f6b9d6c4a0ae60c3c0)
726 set(MD5_PPM_3x2_FLOAT_387 bcc5723c61560463ac60f772e742d092)
727 set(MD5_JPEG_3x2_FLOAT_PROG_MSVC e27840755870fa849872e58aa0cd1400)
728 set(MD5_PPM_3x2_FLOAT_MSVC 6c2880b83bb1aa41dfe330e7a9768690)
730 set(MD5_JPEG_3x2_IFAST_PROG 1396cc2b7185cfe943d408c9d305339e)
731 set(MD5_PPM_3x2_IFAST 3975985ef6eeb0a2cdc58daa651ccc00)
732 set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
733 set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
734 set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
735 set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
736 set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
737 set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
738 set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
739 set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
740 set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
741 set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
742 set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
743 set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
744 set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
745 set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
746 set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
747 set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
748 set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
750 set(TESTORIG testorig.jpg)
751 set(MD5_JPEG_RGB_ISLOW 1d44a406f61da743b5fd31c0a9abdca3)
752 set(MD5_JPEG_RGB_ISLOW2 31d121e57b6c2934c890a7fc7763bcd4)
753 set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
754 set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
755 set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
756 set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
757 set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
758 set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
759 set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
760 set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
761 set(MD5_JPEG_420_IFAST_Q100_PROG e59bb462016a8d9a748c330a3474bb55)
762 set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
763 set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
764 set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
765 set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
766 set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
767 set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
768 set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
769 set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
771 set(MD5_JPEG_3x2_FLOAT_PROG_SSE 343e3f8caf8af5986ebaf0bdc13b5c71)
772 set(MD5_PPM_3x2_FLOAT_SSE 1a75f36e5904d6fc3a85a43da9ad89bb)
773 set(MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT 9bca803d2042bd1eb03819e2bf92b3e5)
774 set(MD5_PPM_3x2_FLOAT_NO_FP_CONTRACT f6bfab038438ed8f5522fbd33595dcdc)
775 set(MD5_JPEG_3x2_FLOAT_PROG_FP_CONTRACT
776 ${MD5_JPEG_3x2_FLOAT_PROG_NO_FP_CONTRACT})
777 set(MD5_PPM_3x2_FLOAT_FP_CONTRACT 0e917a34193ef976b679a6b069b1be26)
778 set(MD5_JPEG_3x2_FLOAT_PROG_387 1657664a410e0822c924b54f6f65e6e9)
779 set(MD5_PPM_3x2_FLOAT_387 cb0a1f027f3d2917c902b5640214e025)
780 set(MD5_JPEG_3x2_FLOAT_PROG_MSVC 7999ce9cd0ee9b6c7043b7351ab7639d)
781 set(MD5_PPM_3x2_FLOAT_MSVC 28cdc448a6b75e97892f0e0f8d4b21f3)
783 set(MD5_JPEG_3x2_IFAST_PROG 1ee5d2c1a77f2da495f993c8c7cceca5)
784 set(MD5_PPM_3x2_IFAST fd283664b3b49127984af0a7f118fccd)
785 set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
786 set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
787 # Since v1.5.1, libjpeg-turbo uses the separate non-fancy upsampling and
788 # YCbCr -> RGB color conversion routines rather than merged upsampling/color
789 # conversion when fancy upsampling is disabled on platforms that have a SIMD
790 # implementation of YCbCr -> RGB color conversion but no SIMD implementation
791 # of merged upsampling/color conversion. This was intended to improve the
792 # performance of the Arm Neon SIMD extensions, the only SIMD extensions for
793 # which those circumstances currently apply. The separate non-fancy
794 # upsampling and color conversion routines usually produce bitwise-identical
795 # output to the merged upsampling/color conversion routines, but that is not
796 # the case when skipping scanlines starting at an odd-numbered scanline. In
797 # libjpeg-turbo 2.0.5 and prior, doing that while using merged h2v2
798 # upsampling caused a segfault, so this test validates the fix for that
799 # segfault. Unfortunately, however, the test also produces different bitwise
800 # output when using the Neon SIMD extensions, because of the aforementioned
801 # optimization. The easiest workaround is to use the old test from
802 # libjpeg-turbo 2.0.5 and prior when using the Neon SIMD extensions. The
803 # aforementioned segfault never would have occurred with the Neon SIMD
804 # extensions anyhow, since merged upsampling is disabled when using them.
805 if((CPU_TYPE STREQUAL "arm64" OR CPU_TYPE STREQUAL "arm") AND WITH_SIMD)
806 set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
808 set(MD5_PPM_420M_IFAST_ARI 57251da28a35b46eecb7177d82d10e0e)
810 set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
811 set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
812 set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
813 set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
814 set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
815 set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
816 set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
817 set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
818 set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
819 set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
820 set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
821 set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
822 set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
823 set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
824 set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
825 set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
826 set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
827 set(MD5_BMP_420M_ISLOW_565D ce034037d212bc403330df6f915c161b)
828 set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
829 set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
830 set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
831 set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
832 set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
833 set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
834 set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
835 set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
840 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
841 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
843 add_test(TJUnitTest-yuv
844 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
845 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
847 add_test(TJUnitTest-yuv-nopad
848 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
849 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
850 TJUnitTest -yuv -noyuvpad)
851 add_test(TJUnitTest-bi
852 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
853 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
855 add_test(TJUnitTest-bi-yuv
856 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
857 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
859 add_test(TJUnitTest-bi-yuv-nopad
860 ${Java_JAVA_EXECUTABLE} ${JAVAARGS} -cp java/turbojpeg.jar
861 -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
862 TJUnitTest -bi -yuv -noyuvpad)
865 set(TEST_LIBTYPES "")
867 set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
870 set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
873 set(TESTIMAGES ${CMAKE_CURRENT_SOURCE_DIR}/testimages)
874 set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
875 if(CMAKE_CROSSCOMPILING)
876 file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
877 file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
880 # The output of the floating point DCT/IDCT algorithms differs depending on the
881 # type of floating point math used, so the FLOATTEST CMake variable must be
882 # set in order to tell the testing system which floating point results it
885 # sse = validate against the expected results from the libjpeg-turbo SSE SIMD
887 # no-fp-contract = validate against the expected results from the C code when
888 # floating point expression contraction is disabled (the
889 # default with Clang, with GCC when building for platforms
890 # that lack fused multiply-add [FMA] instructions, or when
891 # passing -ffp-contract=off to the compiler)
892 # fp-contract = validate against the expected results from the C code when
893 # floating point expression contraction is enabled (the default
894 # with GCC when building for platforms that have fused multiply-
895 # add [FMA] instructions or when passing -ffp-contract=fast to
897 # 387 = validate against the expected results from the C code when the 387 FPU
898 # is being used for floating point math (which is generally the default
899 # with x86 compilers)
900 # msvc = validate against the expected results from the C code when compiled
901 # with a 32-bit version of Visual C++
903 if(CPU_TYPE STREQUAL "x86_64" OR CPU_TYPE STREQUAL "i386")
905 set(DEFAULT_FLOATTEST sse)
906 elseif(CPU_TYPE STREQUAL "x86_64")
907 set(DEFAULT_FLOATTEST no-fp-contract)
908 elseif(CPU_TYPE STREQUAL "i386" AND MSVC)
909 set(DEFAULT_FLOATTEST msvc)
910 # else we can't really set an intelligent default for i386. The appropriate
911 # value could be 387, no-fp-contract, or fp-contract, depending on the
912 # compiler and compiler options. We leave it to the user to set FLOATTEST
916 if((CPU_TYPE STREQUAL "powerpc" OR CPU_TYPE STREQUAL "arm64") AND
917 NOT CMAKE_C_COMPILER_ID STREQUAL "Clang")
918 set(DEFAULT_FLOATTEST fp-contract)
920 set(DEFAULT_FLOATTEST no-fp-contract)
924 # This causes FLOATTEST to reset to the default value if WITH_SIMD has
926 if(DEFINED WITH_SIMD_INT AND NOT WITH_SIMD EQUAL WITH_SIMD_INT)
927 set(FORCE_FLOATTEST "FORCE")
929 set(WITH_SIMD_INT ${WITH_SIMD} CACHE INTERNAL "")
930 set(FLOATTEST ${DEFAULT_FLOATTEST} CACHE STRING
931 "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})"
933 message(STATUS "FLOATTEST = ${FLOATTEST}")
936 string(TOUPPER ${FLOATTEST} FLOATTEST_UC)
937 string(REGEX REPLACE "-" "_" FLOATTEST_UC ${FLOATTEST_UC})
938 string(TOLOWER ${FLOATTEST} FLOATTEST)
939 if(NOT FLOATTEST STREQUAL "sse" AND
940 NOT FLOATTEST STREQUAL "no-fp-contract" AND
941 NOT FLOATTEST STREQUAL "fp-contract" AND NOT FLOATTEST STREQUAL "387" AND
942 NOT FLOATTEST STREQUAL "msvc")
943 message(FATAL_ERROR "\"${FLOATTEST}\" is not a valid value for FLOATTEST.")
947 foreach(libtype ${TEST_LIBTYPES})
948 if(libtype STREQUAL "static")
952 add_test(tjunittest-${libtype}
953 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix})
954 add_test(tjunittest-${libtype}-alloc
955 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -alloc)
956 add_test(tjunittest-${libtype}-yuv
957 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv)
958 add_test(tjunittest-${libtype}-yuv-alloc
959 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -alloc)
960 add_test(tjunittest-${libtype}-yuv-nopad
961 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -yuv -noyuvpad)
962 add_test(tjunittest-${libtype}-bmp
963 ${CMAKE_CROSSCOMPILING_EMULATOR} tjunittest${suffix} -bmp)
965 set(MD5_PPM_GRAY_TILE 89d3ca21213d9d864b50b4e4e7de4ca6)
966 set(MD5_PPM_420_8x8_TILE 847fceab15c5b7b911cb986cf0f71de3)
967 set(MD5_PPM_420_16x16_TILE ca45552a93687e078f7137cc4126a7b0)
968 set(MD5_PPM_420_32x32_TILE d8676f1d6b68df358353bba9844f4a00)
969 set(MD5_PPM_420_64x64_TILE 4e4c1a3d7ea4bace4f868bcbe83b7050)
970 set(MD5_PPM_420_128x128_TILE f24c3429c52265832beab9df72a0ceae)
971 set(MD5_PPM_420M_8x8_TILE bc25320e1f4c31ce2e610e43e9fd173c)
972 set(MD5_PPM_420M_TILE 75ffdf14602258c5c189522af57fa605)
973 set(MD5_PPM_422_8x8_TILE d83dacd9fc73b0a6f10c09acad64eb1e)
974 set(MD5_PPM_422_16x16_TILE 35077fb610d72dd743b1eb0cbcfe10fb)
975 set(MD5_PPM_422_32x32_TILE e6902ed8a449ecc0f0d6f2bf945f65f7)
976 set(MD5_PPM_422_64x64_TILE 2b4502a8f316cedbde1da7bce3d2231e)
977 set(MD5_PPM_422_128x128_TILE f0b5617d578f5e13c8eee215d64d4877)
978 set(MD5_PPM_422M_8x8_TILE 828941d7f41cd6283abd6beffb7fd51d)
979 set(MD5_PPM_422M_TILE e877ae1324c4a280b95376f7f018172f)
980 set(MD5_PPM_444_TILE 7964e41e67cfb8d0a587c0aa4798f9c3)
982 # Test compressing from/decompressing to an arbitrary subregion of a larger
984 add_test(tjbench-${libtype}-tile-cp
985 ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
987 add_test(tjbench-${libtype}-tile
988 ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tile.ppm 95
989 -rgb -quiet -tile -benchtime 0.01 -warmup 0)
990 set_tests_properties(tjbench-${libtype}-tile
991 PROPERTIES DEPENDS tjbench-${libtype}-tile-cp)
993 foreach(tile 8 16 32 64 128)
994 add_test(tjbench-${libtype}-tile-gray-${tile}x${tile}-cmp
995 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_GRAY_TILE}
996 testout_tile_GRAY_Q95_${tile}x${tile}.ppm)
997 foreach(subsamp 420 422)
998 add_test(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
999 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1000 ${MD5_PPM_${subsamp}_${tile}x${tile}_TILE}
1001 testout_tile_${subsamp}_Q95_${tile}x${tile}.ppm)
1003 add_test(tjbench-${libtype}-tile-444-${tile}x${tile}-cmp
1004 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_444_TILE}
1005 testout_tile_444_Q95_${tile}x${tile}.ppm)
1006 foreach(subsamp gray 420 422 444)
1007 set_tests_properties(tjbench-${libtype}-tile-${subsamp}-${tile}x${tile}-cmp
1008 PROPERTIES DEPENDS tjbench-${libtype}-tile)
1012 add_test(tjbench-${libtype}-tilem-cp
1013 ${CMAKE_COMMAND} -E copy_if_different ${TESTIMAGES}/testorig.ppm
1015 add_test(tjbench-${libtype}-tilem
1016 ${CMAKE_CROSSCOMPILING_EMULATOR} tjbench${suffix} testout_tilem.ppm 95
1017 -rgb -fastupsample -quiet -tile -benchtime 0.01 -warmup 0)
1018 set_tests_properties(tjbench-${libtype}-tilem
1019 PROPERTIES DEPENDS tjbench-${libtype}-tilem-cp)
1021 add_test(tjbench-${libtype}-tile-420m-8x8-cmp
1022 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_420M_8x8_TILE}
1023 testout_tilem_420_Q95_8x8.ppm)
1024 add_test(tjbench-${libtype}-tile-422m-8x8-cmp
1025 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5_PPM_422M_8x8_TILE}
1026 testout_tilem_422_Q95_8x8.ppm)
1027 foreach(tile 16 32 64 128)
1028 foreach(subsamp 420 422)
1029 add_test(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1030 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1031 ${MD5_PPM_${subsamp}M_TILE}
1032 testout_tilem_${subsamp}_Q95_${tile}x${tile}.ppm)
1035 foreach(tile 8 16 32 64 128)
1036 foreach(subsamp 420 422)
1037 set_tests_properties(tjbench-${libtype}-tile-${subsamp}m-${tile}x${tile}-cmp
1038 PROPERTIES DEPENDS tjbench-${libtype}-tilem)
1043 # These tests are carefully crafted to provide full coverage of as many of
1044 # the underlying algorithms as possible (including all of the
1045 # SIMD-accelerated ones.)
1047 macro(add_bittest PROG NAME ARGS OUTFILE INFILE MD5SUM)
1048 add_test(${PROG}-${libtype}-${NAME}
1049 ${CMAKE_CROSSCOMPILING_EMULATOR} ${PROG}${suffix} ${ARGS}
1050 -outfile ${OUTFILE} ${INFILE})
1051 add_test(${PROG}-${libtype}-${NAME}-cmp
1052 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP} ${MD5SUM} ${OUTFILE})
1053 set_tests_properties(${PROG}-${libtype}-${NAME}-cmp PROPERTIES
1054 DEPENDS ${PROG}-${libtype}-${NAME})
1055 if(${ARGC} GREATER 6)
1056 set(DEPENDS ${ARGN})
1057 set_tests_properties(${PROG}-${libtype}-${NAME} PROPERTIES
1062 # CC: null SAMP: fullsize FDCT: islow ENT: huff
1063 add_bittest(cjpeg rgb-islow "-rgb;-dct;int;-icc;${TESTIMAGES}/test1.icc"
1064 testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm
1065 ${MD5_JPEG_RGB_ISLOW})
1067 # CC: null SAMP: fullsize IDCT: islow ENT: huff
1068 add_bittest(djpeg rgb-islow "-dct;int;-ppm;-icc;testout_rgb_islow.icc"
1069 testout_rgb_islow.ppm testout_rgb_islow.jpg
1070 ${MD5_PPM_RGB_ISLOW} cjpeg-${libtype}-rgb-islow)
1072 add_test(djpeg-${libtype}-rgb-islow-icc-cmp
1073 ${CMAKE_CROSSCOMPILING_EMULATOR} ${MD5CMP}
1074 b06a39d730129122e85c1363ed1bbc9e testout_rgb_islow.icc)
1075 set_tests_properties(djpeg-${libtype}-rgb-islow-icc-cmp PROPERTIES
1076 DEPENDS djpeg-${libtype}-rgb-islow)
1078 add_bittest(jpegtran icc "-copy;all;-icc;${TESTIMAGES}/test2.icc"
1079 testout_rgb_islow2.jpg testout_rgb_islow.jpg
1080 ${MD5_JPEG_RGB_ISLOW2} cjpeg-${libtype}-rgb-islow)
1083 # CC: RGB->RGB565 SAMP: fullsize IDCT: islow ENT: huff
1084 add_bittest(djpeg rgb-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1085 testout_rgb_islow_565.bmp testout_rgb_islow.jpg
1086 ${MD5_BMP_RGB_ISLOW_565} cjpeg-${libtype}-rgb-islow)
1088 # CC: RGB->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
1089 add_bittest(djpeg rgb-islow-565D "-dct;int;-rgb565;-bmp"
1090 testout_rgb_islow_565D.bmp testout_rgb_islow.jpg
1091 ${MD5_BMP_RGB_ISLOW_565D} cjpeg-${libtype}-rgb-islow)
1094 # CC: RGB->YCC SAMP: fullsize/h2v1 FDCT: ifast ENT: 2-pass huff
1095 add_bittest(cjpeg 422-ifast-opt "-sample;2x1;-dct;fast;-opt"
1096 testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1097 ${MD5_JPEG_422_IFAST_OPT})
1099 # CC: YCC->RGB SAMP: fullsize/h2v1 fancy IDCT: ifast ENT: huff
1100 add_bittest(djpeg 422-ifast "-dct;fast"
1101 testout_422_ifast.ppm testout_422_ifast_opt.jpg
1102 ${MD5_PPM_422_IFAST} cjpeg-${libtype}-422-ifast-opt)
1104 # CC: YCC->RGB SAMP: h2v1 merged IDCT: ifast ENT: huff
1105 add_bittest(djpeg 422m-ifast "-dct;fast;-nosmooth"
1106 testout_422m_ifast.ppm testout_422_ifast_opt.jpg
1107 ${MD5_PPM_422M_IFAST} cjpeg-${libtype}-422-ifast-opt)
1110 # CC: YCC->RGB565 SAMP: h2v1 merged IDCT: ifast ENT: huff
1111 add_bittest(djpeg 422m-ifast-565
1112 "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1113 testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg
1114 ${MD5_BMP_422M_IFAST_565} cjpeg-${libtype}-422-ifast-opt)
1116 # CC: YCC->RGB565 (dithered) SAMP: h2v1 merged IDCT: ifast ENT: huff
1117 add_bittest(djpeg 422m-ifast-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1118 testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg
1119 ${MD5_BMP_422M_IFAST_565D} cjpeg-${libtype}-422-ifast-opt)
1122 # CC: RGB->YCC SAMP: fullsize/h2v2 FDCT: ifast ENT: prog huff
1123 add_bittest(cjpeg 420-q100-ifast-prog
1124 "-sample;2x2;-quality;100;-dct;fast;-scans;${TESTIMAGES}/test.scan"
1125 testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1126 ${MD5_JPEG_420_IFAST_Q100_PROG})
1128 # CC: YCC->RGB SAMP: fullsize/h2v2 fancy IDCT: ifast ENT: prog huff
1129 add_bittest(djpeg 420-q100-ifast-prog "-dct;fast"
1130 testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1131 ${MD5_PPM_420_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1133 # CC: YCC->RGB SAMP: h2v2 merged IDCT: ifast ENT: prog huff
1134 add_bittest(djpeg 420m-q100-ifast-prog "-dct;fast;-nosmooth"
1135 testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg
1136 ${MD5_PPM_420M_Q100_IFAST} cjpeg-${libtype}-420-q100-ifast-prog)
1138 # CC: RGB->Gray SAMP: fullsize FDCT: islow ENT: huff
1139 add_bittest(cjpeg gray-islow "-gray;-dct;int"
1140 testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm
1141 ${MD5_JPEG_GRAY_ISLOW})
1143 # CC: Gray->Gray SAMP: fullsize IDCT: islow ENT: huff
1144 add_bittest(djpeg gray-islow "-dct;int"
1145 testout_gray_islow.ppm testout_gray_islow.jpg
1146 ${MD5_PPM_GRAY_ISLOW} cjpeg-${libtype}-gray-islow)
1148 # CC: Gray->RGB SAMP: fullsize IDCT: islow ENT: huff
1149 add_bittest(djpeg gray-islow-rgb "-dct;int;-rgb"
1150 testout_gray_islow_rgb.ppm testout_gray_islow.jpg
1151 ${MD5_PPM_GRAY_ISLOW_RGB} cjpeg-${libtype}-gray-islow)
1154 # CC: Gray->RGB565 SAMP: fullsize IDCT: islow ENT: huff
1155 add_bittest(djpeg gray-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1156 testout_gray_islow_565.bmp testout_gray_islow.jpg
1157 ${MD5_BMP_GRAY_ISLOW_565} cjpeg-${libtype}-gray-islow)
1159 # CC: Gray->RGB565 (dithered) SAMP: fullsize IDCT: islow ENT: huff
1160 add_bittest(djpeg gray-islow-565D "-dct;int;-rgb565;-bmp"
1161 testout_gray_islow_565D.bmp testout_gray_islow.jpg
1162 ${MD5_BMP_GRAY_ISLOW_565D} cjpeg-${libtype}-gray-islow)
1165 # CC: RGB->YCC SAMP: fullsize smooth/h2v2 smooth FDCT: islow
1167 add_bittest(cjpeg 420s-ifast-opt "-sample;2x2;-smooth;1;-dct;int;-opt"
1168 testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm
1169 ${MD5_JPEG_420S_IFAST_OPT})
1172 # CC: RGB->YCC SAMP: fullsize/int FDCT: float ENT: prog huff
1173 add_bittest(cjpeg 3x2-float-prog "-sample;3x2;-dct;float;-prog"
1174 testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm
1175 ${MD5_JPEG_3x2_FLOAT_PROG_${FLOATTEST_UC}})
1177 # CC: YCC->RGB SAMP: fullsize/int IDCT: float ENT: prog huff
1178 add_bittest(djpeg 3x2-float-prog "-dct;float"
1179 testout_3x2_float.ppm testout_3x2_float_prog.jpg
1180 ${MD5_PPM_3x2_FLOAT_${FLOATTEST_UC}} cjpeg-${libtype}-3x2-float-prog)
1183 # CC: RGB->YCC SAMP: fullsize/int FDCT: ifast ENT: prog huff
1184 add_bittest(cjpeg 3x2-ifast-prog "-sample;3x2;-dct;fast;-prog"
1185 testout_3x2_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm
1186 ${MD5_JPEG_3x2_IFAST_PROG})
1188 # CC: YCC->RGB SAMP: fullsize/int IDCT: ifast ENT: prog huff
1189 add_bittest(djpeg 3x2-ifast-prog "-dct;fast"
1190 testout_3x2_ifast.ppm testout_3x2_ifast_prog.jpg
1191 ${MD5_PPM_3x2_IFAST} cjpeg-${libtype}-3x2-ifast-prog)
1194 # CC: YCC->RGB SAMP: fullsize/h2v2 FDCT: islow ENT: arith
1195 add_bittest(cjpeg 420-islow-ari "-dct;int;-arithmetic"
1196 testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm
1197 ${MD5_JPEG_420_ISLOW_ARI})
1199 add_bittest(jpegtran 420-islow-ari "-arithmetic"
1200 testout_420_islow_ari2.jpg ${TESTIMAGES}/testimgint.jpg
1201 ${MD5_JPEG_420_ISLOW_ARI})
1203 # CC: YCC->RGB SAMP: fullsize FDCT: islow ENT: prog arith
1204 add_bittest(cjpeg 444-islow-progari
1205 "-sample;1x1;-dct;int;-prog;-arithmetic"
1206 testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm
1207 ${MD5_JPEG_444_ISLOW_PROGARI})
1211 # CC: RGB->YCC SAMP: h2v2 merged IDCT: ifast ENT: arith
1212 if((CPU_TYPE STREQUAL "arm64" OR CPU_TYPE STREQUAL "arm") AND WITH_SIMD)
1213 # Refer to the comment above the definition of MD5_PPM_420M_IFAST_ARI for
1214 # an explanation of why this is necessary.
1215 add_bittest(djpeg 420m-ifast-ari "-fast;-ppm"
1216 testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
1217 ${MD5_PPM_420M_IFAST_ARI})
1219 add_bittest(djpeg 420m-ifast-ari "-fast;-skip;1,20;-ppm"
1220 testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg
1221 ${MD5_PPM_420M_IFAST_ARI})
1224 add_bittest(jpegtran 420-islow ""
1225 testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg
1226 ${MD5_JPEG_420_ISLOW})
1229 # 2/1-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 16x16 islow ENT: huff
1230 # 15/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 15x15 islow ENT: huff
1231 # 13/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 13x13 islow ENT: huff
1232 # 11/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 11x11 islow ENT: huff
1233 # 9/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 9x9 islow ENT: huff
1234 # 7/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 7x7 islow/14x14 islow
1236 # 3/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 6x6 islow/12x12 islow
1238 # 5/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 5x5 islow/10x10 islow
1240 # 1/2-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 4x4 islow/8x8 islow
1242 # 3/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 3x3 islow/6x6 islow
1244 # 1/4-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 2x2 islow/4x4 islow
1246 # 1/8-- CC: YCC->RGB SAMP: h2v2 merged IDCT: 1x1 islow/2x2 islow
1248 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)
1249 string(REGEX REPLACE "_" "/" scalearg ${scale})
1250 add_bittest(djpeg 420m-islow-${scale}
1251 "-dct;int;-scale;${scalearg};-nosmooth;-ppm"
1252 testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG}
1253 ${MD5_PPM_420M_ISLOW_${scale}})
1257 # CC: YCC->RGB (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
1258 add_bittest(djpeg 420-islow-256 "-dct;int;-colors;256;-bmp"
1259 testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG}
1260 ${MD5_BMP_420_ISLOW_256})
1262 # CC: YCC->RGB565 SAMP: h2v2 fancy IDCT: islow ENT: huff
1263 add_bittest(djpeg 420-islow-565 "-dct;int;-rgb565;-dither;none;-bmp"
1264 testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1265 ${MD5_BMP_420_ISLOW_565})
1267 # CC: YCC->RGB565 (dithered) SAMP: h2v2 fancy IDCT: islow ENT: huff
1268 add_bittest(djpeg 420-islow-565D "-dct;int;-rgb565;-bmp"
1269 testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1270 ${MD5_BMP_420_ISLOW_565D})
1272 # CC: YCC->RGB565 SAMP: h2v2 merged IDCT: islow ENT: huff
1273 add_bittest(djpeg 420m-islow-565
1274 "-dct;int;-nosmooth;-rgb565;-dither;none;-bmp"
1275 testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG}
1276 ${MD5_BMP_420M_ISLOW_565})
1278 # CC: YCC->RGB565 (dithered) SAMP: h2v2 merged IDCT: islow ENT: huff
1279 add_bittest(djpeg 420m-islow-565D "-dct;int;-nosmooth;-rgb565;-bmp"
1280 testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG}
1281 ${MD5_BMP_420M_ISLOW_565D})
1284 # Partial decode tests. These tests are designed to cover all of the
1285 # possible code paths in jpeg_skip_scanlines().
1287 # Context rows: Yes Intra-iMCU row: Yes iMCU row prefetch: No ENT: huff
1288 add_bittest(djpeg 420-islow-skip15_31 "-dct;int;-skip;15,31;-ppm"
1289 testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG}
1290 ${MD5_PPM_420_ISLOW_SKIP15_31})
1292 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: Yes ENT: arith
1294 add_bittest(djpeg 420-islow-ari-skip16_139 "-dct;int;-skip;16,139;-ppm"
1295 testout_420_islow_ari_skip16,139.ppm ${TESTIMAGES}/testimgari.jpg
1296 ${MD5_PPM_420_ISLOW_ARI_SKIP16_139})
1299 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: prog huff
1300 add_test(cjpeg-${libtype}-420-islow-prog
1301 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog
1302 -outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1303 add_bittest(djpeg 420-islow-prog-crop62x62_71_71
1304 "-dct;int;-crop;62x62+71+71;-ppm"
1305 testout_420_islow_prog_crop62x62,71,71.ppm testout_420_islow_prog.jpg
1306 ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71} cjpeg-${libtype}-420-islow-prog)
1308 # Context rows: Yes Intra-iMCU row: No iMCU row prefetch: No ENT: arith
1310 add_bittest(djpeg 420-islow-ari-crop53x53_4_4
1311 "-dct;int;-crop;53x53+4+4;-ppm"
1312 testout_420_islow_ari_crop53x53,4,4.ppm ${TESTIMAGES}/testimgari.jpg
1313 ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4})
1316 # Context rows: No Intra-iMCU row: Yes ENT: huff
1317 add_test(cjpeg-${libtype}-444-islow
1318 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -sample 1x1
1319 -outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
1320 add_bittest(djpeg 444-islow-skip1_6 "-dct;int;-skip;1,6;-ppm"
1321 testout_444_islow_skip1,6.ppm testout_444_islow.jpg
1322 ${MD5_PPM_444_ISLOW_SKIP1_6} cjpeg-${libtype}-444-islow)
1324 # Context rows: No Intra-iMCU row: No ENT: prog huff
1325 add_test(cjpeg-${libtype}-444-islow-prog
1326 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -prog -sample 1x1
1327 -outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
1328 add_bittest(djpeg 444-islow-prog-crop98x98_13_13
1329 "-dct;int;-crop;98x98+13+13;-ppm"
1330 testout_444_islow_prog_crop98x98,13,13.ppm testout_444_islow_prog.jpg
1331 ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13} cjpeg-${libtype}-444-islow-prog)
1333 # Context rows: No Intra-iMCU row: No ENT: arith
1335 add_test(cjpeg-${libtype}-444-islow-ari
1336 ${CMAKE_CROSSCOMPILING_EMULATOR} cjpeg${suffix} -dct int -arithmetic
1337 -sample 1x1 -outfile testout_444_islow_ari.jpg
1338 ${TESTIMAGES}/testorig.ppm)
1340 add_bittest(djpeg 444-islow-ari-crop37x37_0_0
1341 "-dct;int;-crop;37x37+0+0;-ppm"
1342 testout_444_islow_ari_crop37x37,0,0.ppm testout_444_islow_ari.jpg
1343 ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0} cjpeg-${libtype}-444-islow-ari)
1347 add_bittest(jpegtran crop "-crop;120x90+20+50;-transpose;-perfect"
1348 testout_crop.jpg ${TESTIMAGES}/${TESTORIG}
1353 add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
1354 ${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/testclean.cmake)
1356 configure_file(croptest.in croptest @ONLY)
1357 add_custom_target(croptest
1358 COMMAND echo croptest
1359 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/croptest)
1362 configure_file(tjbenchtest.in tjbenchtest @ONLY)
1363 configure_file(tjexampletest.in tjexampletest @ONLY)
1368 configure_file(tjbenchtest.java.in tjbenchtest.java @ONLY)
1369 configure_file(tjexampletest.java.in tjexampletest.java @ONLY)
1370 add_custom_target(tjtest
1371 COMMAND echo tjbenchtest
1372 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1373 COMMAND echo tjbenchtest -alloc
1374 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1375 COMMAND echo tjbenchtest -yuv
1376 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1377 COMMAND echo tjbenchtest -yuv -alloc
1378 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1379 COMMAND echo tjbenchtest -progressive
1380 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1381 COMMAND echo tjbenchtest -progressive -yuv
1382 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1383 COMMAND echo tjexampletest
1384 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1385 COMMAND echo tjbenchtest.java
1386 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1387 COMMAND echo tjbenchtest.java -yuv
1388 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -yuv
1389 COMMAND echo tjbenchtest.java -progressive
1390 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java -progressive
1391 COMMAND echo tjexampletest.java -progressive -yuv
1392 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1394 COMMAND echo tjexampletest.java
1395 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest.java
1396 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1397 ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest.java
1398 ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest)
1400 add_custom_target(tjtest
1401 COMMAND echo tjbenchtest
1402 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest
1403 COMMAND echo tjbenchtest -alloc
1404 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -alloc
1405 COMMAND echo tjbenchtest -yuv
1406 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv
1407 COMMAND echo tjbenchtest -yuv -alloc
1408 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -yuv -alloc
1409 COMMAND echo tjbenchtest -progressive
1410 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive
1411 COMMAND echo tjbenchtest -progressive -yuv
1412 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest -progressive -yuv
1413 COMMAND echo tjexampletest
1414 COMMAND ${BASH} ${CMAKE_CURRENT_BINARY_DIR}/tjexampletest
1415 DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/tjbenchtest)
1420 ###############################################################################
1422 ###############################################################################
1424 set(EXE ${CMAKE_EXECUTABLE_SUFFIX})
1428 install(TARGETS turbojpeg tjbench
1429 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
1430 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
1431 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1432 if(NOT CMAKE_VERSION VERSION_LESS "3.1" AND MSVC AND
1433 CMAKE_C_LINKER_SUPPORTS_PDB)
1434 install(FILES "$<TARGET_PDB_FILE:turbojpeg>"
1435 DESTINATION ${CMAKE_INSTALL_BINDIR} OPTIONAL)
1439 install(TARGETS turbojpeg-static ARCHIVE
1440 DESTINATION ${CMAKE_INSTALL_LIBDIR})
1441 if(NOT ENABLE_SHARED)
1442 if(MSVC_IDE OR XCODE)
1443 set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1445 set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1447 install(PROGRAMS ${DIR}/tjbench-static${EXE}
1448 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME tjbench${EXE})
1451 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/turbojpeg.h
1452 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1456 install(TARGETS jpeg-static ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR})
1457 if(NOT ENABLE_SHARED)
1458 if(MSVC_IDE OR XCODE)
1459 set(DIR "${CMAKE_CURRENT_BINARY_DIR}/\${CMAKE_INSTALL_CONFIG_NAME}")
1461 set(DIR ${CMAKE_CURRENT_BINARY_DIR})
1463 install(PROGRAMS ${DIR}/cjpeg-static${EXE}
1464 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME cjpeg${EXE})
1465 install(PROGRAMS ${DIR}/djpeg-static${EXE}
1466 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME djpeg${EXE})
1467 install(PROGRAMS ${DIR}/jpegtran-static${EXE}
1468 DESTINATION ${CMAKE_INSTALL_BINDIR} RENAME jpegtran${EXE})
1472 install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR})
1474 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/README.ijg
1475 ${CMAKE_CURRENT_SOURCE_DIR}/README.md ${CMAKE_CURRENT_SOURCE_DIR}/example.txt
1476 ${CMAKE_CURRENT_SOURCE_DIR}/tjexample.c
1477 ${CMAKE_CURRENT_SOURCE_DIR}/libjpeg.txt
1478 ${CMAKE_CURRENT_SOURCE_DIR}/structure.txt
1479 ${CMAKE_CURRENT_SOURCE_DIR}/usage.txt ${CMAKE_CURRENT_SOURCE_DIR}/wizard.txt
1480 ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE.md DESTINATION ${CMAKE_INSTALL_DOCDIR})
1482 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/java/TJExample.java
1483 DESTINATION ${CMAKE_INSTALL_DOCDIR})
1487 install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/cjpeg.1
1488 ${CMAKE_CURRENT_SOURCE_DIR}/djpeg.1 ${CMAKE_CURRENT_SOURCE_DIR}/jpegtran.1
1489 ${CMAKE_CURRENT_SOURCE_DIR}/rdjpgcom.1
1490 ${CMAKE_CURRENT_SOURCE_DIR}/wrjpgcom.1
1491 DESTINATION ${CMAKE_INSTALL_MANDIR}/man1)
1493 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libjpeg.pc
1494 ${CMAKE_CURRENT_BINARY_DIR}/pkgscripts/libturbojpeg.pc
1495 DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig)
1497 install(FILES ${CMAKE_CURRENT_BINARY_DIR}/jconfig.h
1498 ${CMAKE_CURRENT_SOURCE_DIR}/jerror.h ${CMAKE_CURRENT_SOURCE_DIR}/jmorecfg.h
1499 ${CMAKE_CURRENT_SOURCE_DIR}/jpeglib.h
1500 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
1502 include(cmakescripts/BuildPackages.cmake)
1504 configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmakescripts/cmake_uninstall.cmake.in"
1505 "cmake_uninstall.cmake" IMMEDIATE @ONLY)
1507 add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P cmake_uninstall.cmake)