Home | History | Annotate | Download | only in libjpeg-turbo
      1 #
      2 # Setup
      3 #
      4 
      5 cmake_minimum_required(VERSION 2.8.11)
      6 # Use LINK_INTERFACE_LIBRARIES instead of INTERFACE_LINK_LIBRARIES
      7 if(POLICY CMP0022)
      8   cmake_policy(SET CMP0022 OLD)
      9 endif()
     10 
     11 project(libjpeg-turbo C)
     12 set(VERSION 1.5.3)
     13 string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
     14 list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
     15 list(GET VERSION_TRIPLET 1 VERSION_MINOR)
     16 list(GET VERSION_TRIPLET 2 VERSION_REVISION)
     17 function(pad_number NUMBER OUTPUT_LEN)
     18   string(LENGTH "${${NUMBER}}" INPUT_LEN)
     19   if(INPUT_LEN LESS OUTPUT_LEN)
     20     math(EXPR ZEROES "${OUTPUT_LEN} - ${INPUT_LEN} - 1")
     21     set(NUM ${${NUMBER}})
     22     foreach(C RANGE ${ZEROES})
     23       set(NUM "0${NUM}")
     24     endforeach()
     25     set(${NUMBER} ${NUM} PARENT_SCOPE)
     26   endif()
     27 endfunction()
     28 pad_number(VERSION_MINOR 3)
     29 pad_number(VERSION_REVISION 3)
     30 set(LIBJPEG_TURBO_VERSION_NUMBER ${VERSION_MAJOR}${VERSION_MINOR}${VERSION_REVISION})
     31 
     32 if(NOT WIN32)
     33   message(FATAL_ERROR "Platform not supported by this build system.  Use autotools instead.")
     34 endif()
     35 
     36 string(TIMESTAMP BUILD "%Y%m%d")
     37 
     38 # This does nothing except when using MinGW.  CMAKE_BUILD_TYPE has no meaning
     39 # in Visual Studio, and it always defaults to Debug when using NMake.
     40 if(NOT CMAKE_BUILD_TYPE)
     41   set(CMAKE_BUILD_TYPE Release)
     42 endif()
     43 
     44 message(STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
     45 
     46 # This only works if building from the command line.  There is currently no way
     47 # to set a variable's value based on the build type when using Visual Studio.
     48 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
     49   set(BUILD "${BUILD}d")
     50 endif()
     51 
     52 message(STATUS "VERSION = ${VERSION}, BUILD = ${BUILD}")
     53 
     54 option(WITH_SIMD "Include SIMD extensions" TRUE)
     55 option(WITH_ARITH_ENC "Include arithmetic encoding support when emulating the libjpeg v6b API/ABI" TRUE)
     56 option(WITH_ARITH_DEC "Include arithmetic decoding support when emulating the libjpeg v6b API/ABI" TRUE)
     57 option(WITH_JPEG7 "Emulate libjpeg v7 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE)
     58 option(WITH_JPEG8 "Emulate libjpeg v8 API/ABI (this makes libjpeg-turbo backward incompatible with libjpeg v6b)" FALSE)
     59 option(WITH_MEM_SRCDST "Include in-memory source/destination manager functions when emulating the libjpeg v6b or v7 API/ABI" TRUE)
     60 option(WITH_TURBOJPEG "Include the TurboJPEG wrapper library and associated test programs" TRUE)
     61 option(WITH_JAVA "Build Java wrapper for the TurboJPEG library" FALSE)
     62 option(WITH_12BIT "Encode/decode JPEG images with 12-bit samples (implies WITH_SIMD=0 WITH_TURBOJPEG=0 WITH_ARITH_ENC=0 WITH_ARITH_DEC=0)" FALSE)
     63 option(ENABLE_STATIC "Build static libraries" TRUE)
     64 option(ENABLE_SHARED "Build shared libraries" TRUE)
     65 
     66 if(WITH_12BIT)
     67   set(WITH_SIMD FALSE)
     68   set(WITH_TURBOJPEG FALSE)
     69   set(WITH_JAVA FALSE)
     70   set(WITH_ARITH_ENC FALSE)
     71   set(WITH_ARITH_DEC FALSE)
     72   set(BITS_IN_JSAMPLE 12)
     73   message(STATUS "12-bit JPEG support enabled")
     74 else()
     75   set(BITS_IN_JSAMPLE 8)
     76 endif()
     77 
     78 if(WITH_JPEG8 OR WITH_JPEG7)
     79   set(WITH_ARITH_ENC 1)
     80   set(WITH_ARITH_DEC 1)
     81 endif()
     82 if(WITH_JPEG8)
     83   set(WITH_MEM_SRCDST 1)
     84 endif()
     85 
     86 if(WITH_ARITH_ENC)
     87   set(C_ARITH_CODING_SUPPORTED 1)
     88   message(STATUS "Arithmetic encoding support enabled")
     89 else()
     90   message(STATUS "Arithmetic encoding support disabled")
     91 endif()
     92 
     93 if(WITH_ARITH_DEC)
     94   set(D_ARITH_CODING_SUPPORTED 1)
     95   message(STATUS "Arithmetic decoding support enabled")
     96 else()
     97   message(STATUS "Arithmetic decoding support disabled")
     98 endif()
     99 
    100 if(WITH_TURBOJPEG)
    101   message(STATUS "TurboJPEG C wrapper enabled")
    102 else()
    103   message(STATUS "TurboJPEG C wrapper disabled")
    104 endif()
    105 
    106 if(WITH_JAVA)
    107   message(STATUS "TurboJPEG Java wrapper enabled")
    108 else()
    109   message(STATUS "TurboJPEG Java wrapper disabled")
    110 endif()
    111 
    112 set(SO_AGE 0)
    113 if(WITH_MEM_SRCDST)
    114   set(SO_AGE 1)
    115 endif()
    116 
    117 set(JPEG_LIB_VERSION 62)
    118 set(DLL_VERSION ${JPEG_LIB_VERSION})
    119 set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
    120 if(WITH_JPEG8)
    121   set(JPEG_LIB_VERSION 80)
    122   set(DLL_VERSION 8)
    123   set(FULLVERSION ${DLL_VERSION}.0.2)
    124   message(STATUS "Emulating libjpeg v8 API/ABI")
    125 elseif(WITH_JPEG7)
    126   set(JPEG_LIB_VERSION 70)
    127   set(DLL_VERSION 7)
    128   set(FULLVERSION ${DLL_VERSION}.${SO_AGE}.0)
    129   message(STATUS "Emulating libjpeg v7 API/ABI")
    130 endif(WITH_JPEG8)
    131 
    132 if(WITH_MEM_SRCDST)
    133   set(MEM_SRCDST_SUPPORTED 1)
    134   message(STATUS "In-memory source/destination managers enabled")
    135 else()
    136   message(STATUS "In-memory source/destination managers disabled")
    137 endif()
    138 
    139 if(MSVC)
    140   option(WITH_CRT_DLL
    141     "Link all libjpeg-turbo 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."
    142     FALSE)
    143   if(NOT WITH_CRT_DLL)
    144     # Use the static C library for all build types
    145     foreach(var CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
    146       CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO)
    147       if(${var} MATCHES "/MD")
    148         string(REGEX REPLACE "/MD" "/MT" ${var} "${${var}}")
    149       endif()
    150     endforeach()
    151   endif()
    152   add_definitions(-W3 -wd4996)
    153 endif()
    154 
    155 # Detect whether compiler is 64-bit
    156 if(MSVC AND CMAKE_CL_64)
    157   set(SIMD_X86_64 1)
    158   set(64BIT 1)
    159 elseif(CMAKE_SIZEOF_VOID_P MATCHES 8)
    160   set(SIMD_X86_64 1)
    161   set(64BIT 1)
    162 endif()
    163 
    164 if(64BIT)
    165   message(STATUS "64-bit build")
    166 else()
    167   message(STATUS "32-bit build")
    168 endif()
    169 
    170 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
    171   if(MSVC)
    172     set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME})
    173   else()
    174     set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_PROJECT_NAME}-gcc)
    175   endif()
    176   if(64BIT)
    177     set(CMAKE_INSTALL_PREFIX_DEFAULT ${CMAKE_INSTALL_PREFIX_DEFAULT}64)
    178   endif()
    179   set(CMAKE_INSTALL_PREFIX "c:/${CMAKE_INSTALL_PREFIX_DEFAULT}" CACHE PATH
    180     "Directory into which to install libjpeg-turbo (default: c:/${CMAKE_INSTALL_PREFIX_DEFAULT})"
    181     FORCE)
    182 endif()
    183 
    184 message(STATUS "Install directory = ${CMAKE_INSTALL_PREFIX}")
    185 
    186 configure_file(win/jconfig.h.in jconfig.h)
    187 configure_file(win/jconfigint.h.in jconfigint.h)
    188 
    189 include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
    190 
    191 string(TOUPPER ${CMAKE_BUILD_TYPE} CMAKE_BUILD_TYPE_UC)
    192 
    193 set(EFFECTIVE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
    194 message(STATUS "Compiler flags = ${EFFECTIVE_C_FLAGS}")
    195 
    196 set(EFFECTIVE_LD_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${CMAKE_EXE_LINKER_FLAGS_${CMAKE_BUILD_TYPE_UC}}")
    197 message(STATUS "Linker flags = ${EFFECTIVE_LD_FLAGS}")
    198 
    199 if(WITH_JAVA)
    200   find_package(Java)
    201   find_package(JNI)
    202   if(DEFINED JAVACFLAGS)
    203     message(STATUS "Java compiler flags = ${JAVACFLAGS}")
    204   endif()
    205 endif()
    206 
    207 
    208 #
    209 # Targets
    210 #
    211 
    212 set(JPEG_SOURCES jcapimin.c jcapistd.c jccoefct.c jccolor.c jcdctmgr.c jchuff.c
    213   jcinit.c jcmainct.c jcmarker.c jcmaster.c jcomapi.c jcparam.c jcphuff.c
    214   jcprepct.c jcsample.c jctrans.c jdapimin.c jdapistd.c jdatadst.c jdatasrc.c
    215   jdcoefct.c jdcolor.c jddctmgr.c jdhuff.c jdinput.c jdmainct.c jdmarker.c
    216   jdmaster.c jdmerge.c jdphuff.c jdpostct.c jdsample.c jdtrans.c jerror.c
    217   jfdctflt.c jfdctfst.c jfdctint.c jidctflt.c jidctfst.c jidctint.c jidctred.c
    218   jquant1.c jquant2.c jutils.c jmemmgr.c jmemnobs.c)
    219 
    220 if(WITH_ARITH_ENC OR WITH_ARITH_DEC)
    221   set(JPEG_SOURCES ${JPEG_SOURCES} jaricom.c)
    222 endif()
    223 
    224 if(WITH_ARITH_ENC)
    225   set(JPEG_SOURCES ${JPEG_SOURCES} jcarith.c)
    226 endif()
    227 
    228 if(WITH_ARITH_DEC)
    229   set(JPEG_SOURCES ${JPEG_SOURCES} jdarith.c)
    230 endif()
    231 
    232 if(WITH_SIMD)
    233   add_definitions(-DWITH_SIMD)
    234   add_subdirectory(simd)
    235   if(SIMD_X86_64)
    236     set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_x86_64.c)
    237   else()
    238     set(JPEG_SOURCES ${JPEG_SOURCES} simd/jsimd_i386.c)
    239   endif()
    240   # This tells CMake that the "source" files haven't been generated yet
    241   set_source_files_properties(${SIMD_OBJS} PROPERTIES GENERATED 1)
    242 else()
    243   set(JPEG_SOURCES ${JPEG_SOURCES} jsimd_none.c)
    244   message(STATUS "Not using SIMD acceleration")
    245 endif()
    246 
    247 if(WITH_JAVA)
    248   add_subdirectory(java)
    249   set(ENABLE_SHARED TRUE)
    250 endif()
    251 
    252 if(ENABLE_SHARED)
    253   add_subdirectory(sharedlib)
    254 endif()
    255 
    256 if(ENABLE_STATIC OR WITH_TURBOJPEG)
    257   add_library(jpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS})
    258   if(NOT MSVC)
    259     set_target_properties(jpeg-static PROPERTIES OUTPUT_NAME jpeg)
    260   endif()
    261   if(WITH_SIMD)
    262     add_dependencies(jpeg-static simd)
    263   endif()
    264 endif()
    265 
    266 if(WITH_TURBOJPEG)
    267   set(TURBOJPEG_SOURCES turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
    268   if(WITH_JAVA)
    269     set(TURBOJPEG_SOURCES ${TURBOJPEG_SOURCES} turbojpeg-jni.c)
    270     include_directories(${JAVA_INCLUDE_PATH} ${JAVA_INCLUDE_PATH2})
    271   endif()
    272 
    273   if(ENABLE_SHARED)
    274     add_library(turbojpeg SHARED ${TURBOJPEG_SOURCES})
    275     set_target_properties(turbojpeg PROPERTIES DEFINE_SYMBOL DLLDEFINE)
    276     if(MINGW)
    277       set_target_properties(turbojpeg PROPERTIES LINK_FLAGS -Wl,--kill-at)
    278     endif()
    279     target_link_libraries(turbojpeg jpeg-static)
    280     set_target_properties(turbojpeg PROPERTIES LINK_INTERFACE_LIBRARIES "")
    281 
    282     add_executable(tjunittest tjunittest.c tjutil.c)
    283     target_link_libraries(tjunittest turbojpeg)
    284 
    285     add_executable(tjbench tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c wrbmp.c
    286       wrppm.c)
    287     target_link_libraries(tjbench turbojpeg jpeg-static)
    288     set_property(TARGET tjbench PROPERTY COMPILE_FLAGS
    289       "-DBMP_SUPPORTED -DPPM_SUPPORTED")
    290   endif()
    291 
    292   if(ENABLE_STATIC)
    293     add_library(turbojpeg-static STATIC ${JPEG_SOURCES} ${SIMD_OBJS}
    294       turbojpeg.c transupp.c jdatadst-tj.c jdatasrc-tj.c)
    295     if(NOT MSVC)
    296       set_target_properties(turbojpeg-static PROPERTIES OUTPUT_NAME turbojpeg)
    297     endif()
    298     if(WITH_SIMD)
    299       add_dependencies(turbojpeg-static simd)
    300     endif()
    301 
    302     add_executable(tjunittest-static tjunittest.c tjutil.c)
    303     target_link_libraries(tjunittest-static turbojpeg-static)
    304 
    305     add_executable(tjbench-static tjbench.c bmp.c tjutil.c rdbmp.c rdppm.c
    306       wrbmp.c wrppm.c)
    307     target_link_libraries(tjbench-static turbojpeg-static jpeg-static)
    308     set_property(TARGET tjbench-static PROPERTY COMPILE_FLAGS
    309       "-DBMP_SUPPORTED -DPPM_SUPPORTED")
    310   endif()
    311 endif()
    312 
    313 if(WITH_12BIT)
    314   set(COMPILE_FLAGS "-DGIF_SUPPORTED -DPPM_SUPPORTED -DUSE_SETMODE")
    315 else()
    316   set(COMPILE_FLAGS "-DBMP_SUPPORTED -DGIF_SUPPORTED -DPPM_SUPPORTED -DTARGA_SUPPORTED -DUSE_SETMODE")
    317   set(CJPEG_BMP_SOURCES rdbmp.c rdtarga.c)
    318   set(DJPEG_BMP_SOURCES wrbmp.c wrtarga.c)
    319 endif()
    320 
    321 if(ENABLE_STATIC)
    322   add_executable(cjpeg-static cjpeg.c cdjpeg.c rdgif.c rdppm.c rdswitch.c
    323     ${CJPEG_BMP_SOURCES})
    324   set_property(TARGET cjpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
    325   target_link_libraries(cjpeg-static jpeg-static)
    326 
    327   add_executable(djpeg-static djpeg.c cdjpeg.c rdcolmap.c rdswitch.c wrgif.c
    328     wrppm.c ${DJPEG_BMP_SOURCES})
    329   set_property(TARGET djpeg-static PROPERTY COMPILE_FLAGS ${COMPILE_FLAGS})
    330   target_link_libraries(djpeg-static jpeg-static)
    331 
    332   add_executable(jpegtran-static jpegtran.c cdjpeg.c rdswitch.c transupp.c)
    333   target_link_libraries(jpegtran-static jpeg-static)
    334   set_property(TARGET jpegtran-static PROPERTY COMPILE_FLAGS "-DUSE_SETMODE")
    335 endif()
    336 
    337 add_executable(rdjpgcom rdjpgcom.c)
    338 
    339 add_executable(wrjpgcom wrjpgcom.c)
    340 
    341 
    342 #
    343 # Tests
    344 #
    345 
    346 add_subdirectory(md5)
    347 
    348 if(MSVC_IDE)
    349   set(OBJDIR "\${CTEST_CONFIGURATION_TYPE}/")
    350 else()
    351   set(OBJDIR "")
    352 endif()
    353 
    354 enable_testing()
    355 
    356 if(WITH_12BIT)
    357   set(TESTORIG testorig12.jpg)
    358   set(MD5_JPEG_RGB_ISLOW 9620f424569594bb9242b48498ad801f)
    359   set(MD5_PPM_RGB_ISLOW f3301d2219783b8b3d942b7239fa50c0)
    360   set(MD5_JPEG_422_IFAST_OPT 7322e3bd2f127f7de4b40d4480ce60e4)
    361   set(MD5_PPM_422_IFAST 79807fa552899e66a04708f533e16950)
    362   set(MD5_PPM_422M_IFAST 07737bfe8a7c1c87aaa393a0098d16b0)
    363   set(MD5_JPEG_420_IFAST_Q100_PROG a1da220b5604081863a504297ed59e55)
    364   set(MD5_PPM_420_Q100_IFAST 1b3730122709f53d007255e8dfd3305e)
    365   set(MD5_PPM_420M_Q100_IFAST 980a1a3c5bf9510022869d30b7d26566)
    366   set(MD5_JPEG_GRAY_ISLOW 235c90707b16e2e069f37c888b2636d9)
    367   set(MD5_PPM_GRAY_ISLOW 7213c10af507ad467da5578ca5ee1fca)
    368   set(MD5_PPM_GRAY_ISLOW_RGB e96ee81c30a6ed422d466338bd3de65d)
    369   set(MD5_JPEG_420S_IFAST_OPT 7af8e60be4d9c227ec63ac9b6630855e)
    370   if(64BIT)
    371     # Windows/x64 uses SSE for floating point
    372     set(MD5_JPEG_3x2_FLOAT_PROG a8c17daf77b457725ec929e215b603f8)
    373     set(MD5_PPM_3x2_FLOAT 42876ab9e5c2f76a87d08db5fbd57956)
    374   else()
    375     # Windows/x86 uses the 387 FPU for floating point
    376     if(MSVC)
    377       set(MD5_JPEG_3x2_FLOAT_PROG e27840755870fa849872e58aa0cd1400)
    378       set(MD5_PPM_3x2_FLOAT 6c2880b83bb1aa41dfe330e7a9768690)
    379     else()
    380       set(MD5_JPEG_3x2_FLOAT_PROG bc6dbbefac2872f6b9d6c4a0ae60c3c0)
    381       set(MD5_PPM_3x2_FLOAT f58119ee294198ac9b4a9f5645a34266)
    382     endif()
    383   endif()
    384   set(MD5_PPM_420M_ISLOW_2_1 4ca6be2a6f326ff9eaab63e70a8259c0)
    385   set(MD5_PPM_420M_ISLOW_15_8 12aa9f9534c1b3d7ba047322226365eb)
    386   set(MD5_PPM_420M_ISLOW_13_8 f7e22817c7b25e1393e4ec101e9d4e96)
    387   set(MD5_PPM_420M_ISLOW_11_8 800a16f9f4dc9b293197bfe11be10a82)
    388   set(MD5_PPM_420M_ISLOW_9_8 06b7a92a9bc69f4dc36ec40f1937d55c)
    389   set(MD5_PPM_420M_ISLOW_7_8 3ec444a14a4ab4eab88ffc49c48eca43)
    390   set(MD5_PPM_420M_ISLOW_3_4 3e726b7ea872445b19437d1c1d4f0d93)
    391   set(MD5_PPM_420M_ISLOW_5_8 a8a771abdc94301d20ffac119b2caccd)
    392   set(MD5_PPM_420M_ISLOW_1_2 b419124dd5568b085787234866102866)
    393   set(MD5_PPM_420M_ISLOW_3_8 343d19015531b7bbe746124127244fa8)
    394   set(MD5_PPM_420M_ISLOW_1_4 35fd59d866e44659edfa3c18db2a3edb)
    395   set(MD5_PPM_420M_ISLOW_1_8 ccaed48ac0aedefda5d4abe4013f4ad7)
    396   set(MD5_PPM_420_ISLOW_SKIP15_31 86664cd9dc956536409e44e244d20a97)
    397   set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 452a21656115a163029cfba5c04fa76a)
    398   set(MD5_PPM_444_ISLOW_SKIP1_6 ef63901f71ef7a75cd78253fc0914f84)
    399   set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 15b173fb5872d9575572fbcc1b05956f)
    400   set(MD5_JPEG_CROP cdb35ff4b4519392690ea040c56ea99c)
    401 else()
    402   set(TESTORIG testorig.jpg)
    403   set(MD5_JPEG_RGB_ISLOW 768e970dd57b340ff1b83c9d3d47c77b)
    404   set(MD5_PPM_RGB_ISLOW 00a257f5393fef8821f2b88ac7421291)
    405   set(MD5_BMP_RGB_ISLOW_565 f07d2e75073e4bb10f6c6f4d36e2e3be)
    406   set(MD5_BMP_RGB_ISLOW_565D 4cfa0928ef3e6bb626d7728c924cfda4)
    407   set(MD5_JPEG_422_IFAST_OPT 2540287b79d913f91665e660303ab2c8)
    408   set(MD5_PPM_422_IFAST 35bd6b3f833bad23de82acea847129fa)
    409   set(MD5_PPM_422M_IFAST 8dbc65323d62cca7c91ba02dd1cfa81d)
    410   set(MD5_BMP_422M_IFAST_565 3294bd4d9a1f2b3d08ea6020d0db7065)
    411   set(MD5_BMP_422M_IFAST_565D da98c9c7b6039511be4a79a878a9abc1)
    412   set(MD5_JPEG_420_IFAST_Q100_PROG 990cbe0329c882420a2094da7e5adade)
    413   set(MD5_PPM_420_Q100_IFAST 5a732542015c278ff43635e473a8a294)
    414   set(MD5_PPM_420M_Q100_IFAST ff692ee9323a3b424894862557c092f1)
    415   set(MD5_JPEG_GRAY_ISLOW 72b51f894b8f4a10b3ee3066770aa38d)
    416   set(MD5_PPM_GRAY_ISLOW 8d3596c56eace32f205deccc229aa5ed)
    417   set(MD5_PPM_GRAY_ISLOW_RGB 116424ac07b79e5e801f00508eab48ec)
    418   set(MD5_BMP_GRAY_ISLOW_565 12f78118e56a2f48b966f792fedf23cc)
    419   set(MD5_BMP_GRAY_ISLOW_565D bdbbd616441a24354c98553df5dc82db)
    420   set(MD5_JPEG_420S_IFAST_OPT 388708217ac46273ca33086b22827ed8)
    421   if(WITH_SIMD)
    422     set(MD5_JPEG_3x2_FLOAT_PROG 343e3f8caf8af5986ebaf0bdc13b5c71)
    423     set(MD5_PPM_3x2_FLOAT 1a75f36e5904d6fc3a85a43da9ad89bb)
    424   else()
    425     if(64BIT)
    426       set(MD5_JPEG_3x2_FLOAT_PROG 9bca803d2042bd1eb03819e2bf92b3e5)
    427       set(MD5_PPM_3x2_FLOAT f6bfab038438ed8f5522fbd33595dcdc)
    428     else()
    429       if(MSVC)
    430         set(MD5_JPEG_3x2_FLOAT_PROG 7999ce9cd0ee9b6c7043b7351ab7639d)
    431         set(MD5_PPM_3x2_FLOAT 28cdc448a6b75e97892f0e0f8d4b21f3)
    432       else()
    433         set(MD5_JPEG_3x2_FLOAT_PROG 1657664a410e0822c924b54f6f65e6e9)
    434         set(MD5_PPM_3x2_FLOAT cb0a1f027f3d2917c902b5640214e025)
    435       endif()
    436     endif()
    437   endif()
    438   set(MD5_JPEG_420_ISLOW_ARI e986fb0a637a8d833d96e8a6d6d84ea1)
    439   set(MD5_JPEG_444_ISLOW_PROGARI 0a8f1c8f66e113c3cf635df0a475a617)
    440   set(MD5_PPM_420M_IFAST_ARI 72b59a99bcf1de24c5b27d151bde2437)
    441   set(MD5_JPEG_420_ISLOW 9a68f56bc76e466aa7e52f415d0f4a5f)
    442   set(MD5_PPM_420M_ISLOW_2_1 9f9de8c0612f8d06869b960b05abf9c9)
    443   set(MD5_PPM_420M_ISLOW_15_8 b6875bc070720b899566cc06459b63b7)
    444   set(MD5_PPM_420M_ISLOW_13_8 bc3452573c8152f6ae552939ee19f82f)
    445   set(MD5_PPM_420M_ISLOW_11_8 d8cc73c0aaacd4556569b59437ba00a5)
    446   set(MD5_PPM_420M_ISLOW_9_8 d25e61bc7eac0002f5b393aa223747b6)
    447   set(MD5_PPM_420M_ISLOW_7_8 ddb564b7c74a09494016d6cd7502a946)
    448   set(MD5_PPM_420M_ISLOW_3_4 8ed8e68808c3fbc4ea764fc9d2968646)
    449   set(MD5_PPM_420M_ISLOW_5_8 a3363274999da2366a024efae6d16c9b)
    450   set(MD5_PPM_420M_ISLOW_1_2 e692a315cea26b988c8e8b29a5dbcd81)
    451   set(MD5_PPM_420M_ISLOW_3_8 79eca9175652ced755155c90e785a996)
    452   set(MD5_PPM_420M_ISLOW_1_4 79cd778f8bf1a117690052cacdd54eca)
    453   set(MD5_PPM_420M_ISLOW_1_8 391b3d4aca640c8567d6f8745eb2142f)
    454   set(MD5_BMP_420_ISLOW_256 4980185e3776e89bd931736e1cddeee6)
    455   set(MD5_BMP_420_ISLOW_565 bf9d13e16c4923b92e1faa604d7922cb)
    456   set(MD5_BMP_420_ISLOW_565D 6bde71526acc44bcff76f696df8638d2)
    457   set(MD5_BMP_420M_ISLOW_565 8dc0185245353cfa32ad97027342216f)
    458   set(MD5_BMP_420M_ISLOW_565D d1be3a3339166255e76fa50a0d70d73e)
    459   set(MD5_PPM_420_ISLOW_SKIP15_31 c4c65c1e43d7275cd50328a61e6534f0)
    460   set(MD5_PPM_420_ISLOW_ARI_SKIP16_139 087c6b123db16ac00cb88c5b590bb74a)
    461   set(MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71 26eb36ccc7d1f0cb80cdabb0ac8b5d99)
    462   set(MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4 886c6775af22370257122f8b16207e6d)
    463   set(MD5_PPM_444_ISLOW_SKIP1_6 5606f86874cf26b8fcee1117a0a436a6)
    464   set(MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13 db87dc7ce26bcdc7a6b56239ce2b9d6c)
    465   set(MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0 cb57b32bd6d03e35432362f7bf184b6d)
    466   set(MD5_JPEG_CROP b4197f377e621c4e9b1d20471432610d)
    467 endif()
    468 
    469 if(WITH_JAVA)
    470   add_test(TJUnitTest
    471     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    472       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    473       TJUnitTest)
    474   add_test(TJUnitTest-yuv
    475     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    476       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    477       TJUnitTest -yuv)
    478   add_test(TJUnitTest-yuv-nopad
    479     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    480       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    481       TJUnitTest -yuv -noyuvpad)
    482   add_test(TJUnitTest-bi
    483     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    484       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    485       TJUnitTest -bi)
    486   add_test(TJUnitTest-bi-yuv
    487     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    488       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    489       TJUnitTest -bi -yuv)
    490   add_test(TJUnitTest-bi-yuv-nopad
    491     ${JAVA_RUNTIME} -cp java/${OBJDIR}turbojpeg.jar
    492       -Djava.library.path=${CMAKE_CURRENT_BINARY_DIR}/${OBJDIR}
    493       TJUnitTest -bi -yuv -noyuvpad)
    494 endif()
    495 
    496 set(TEST_LIBTYPES "")
    497 if(ENABLE_SHARED)
    498   set(TEST_LIBTYPES ${TEST_LIBTYPES} shared)
    499 endif()
    500 if(ENABLE_STATIC)
    501   set(TEST_LIBTYPES ${TEST_LIBTYPES} static)
    502 endif()
    503 
    504 set(TESTIMAGES ${CMAKE_SOURCE_DIR}/testimages)
    505 set(MD5CMP ${CMAKE_CURRENT_BINARY_DIR}/md5/md5cmp)
    506 if(CMAKE_CROSSCOMPILING)
    507   file(RELATIVE_PATH TESTIMAGES ${CMAKE_CURRENT_BINARY_DIR} ${TESTIMAGES})
    508   file(RELATIVE_PATH MD5CMP ${CMAKE_CURRENT_BINARY_DIR} ${MD5CMP})
    509 endif()
    510 
    511 foreach(libtype ${TEST_LIBTYPES})
    512   if(libtype STREQUAL "shared")
    513     set(dir sharedlib/)
    514   else()
    515     set(dir "")
    516     set(suffix -static)
    517   endif()
    518   if(WITH_TURBOJPEG)
    519     add_test(tjunittest${suffix} tjunittest${suffix})
    520     add_test(tjunittest${suffix}-alloc tjunittest${suffix} -alloc)
    521     add_test(tjunittest${suffix}-yuv tjunittest${suffix} -yuv)
    522     add_test(tjunittest${suffix}-yuv-alloc tjunittest${suffix} -yuv -alloc)
    523     add_test(tjunittest${suffix}-yuv-nopad tjunittest${suffix} -yuv -noyuvpad)
    524   endif()
    525 
    526   # These tests are carefully chosen to provide full coverage of as many of the
    527   # underlying algorithms as possible (including all of the SIMD-accelerated
    528   # ones.)
    529 
    530   # CC: null  SAMP: fullsize  FDCT: islow  ENT: huff
    531   add_test(cjpeg${suffix}-rgb-islow
    532     ${dir}cjpeg${suffix} -rgb -dct int
    533       -outfile testout_rgb_islow.jpg ${TESTIMAGES}/testorig.ppm)
    534   add_test(cjpeg${suffix}-rgb-islow-cmp
    535     ${MD5CMP} ${MD5_JPEG_RGB_ISLOW} testout_rgb_islow.jpg)
    536 
    537   # CC: null  SAMP: fullsize  IDCT: islow  ENT: huff
    538   add_test(djpeg${suffix}-rgb-islow
    539     ${dir}djpeg${suffix} -dct int -ppm
    540       -outfile testout_rgb_islow.ppm testout_rgb_islow.jpg)
    541   add_test(djpeg${suffix}-rgb-islow-cmp
    542     ${MD5CMP} ${MD5_PPM_RGB_ISLOW} testout_rgb_islow.ppm)
    543 
    544   if(NOT WITH_12BIT)
    545     # CC: RGB->RGB565  SAMP: fullsize  IDCT: islow  ENT: huff
    546     add_test(djpeg${suffix}-rgb-islow-565
    547       ${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
    548         -outfile testout_rgb_islow_565.bmp testout_rgb_islow.jpg)
    549     add_test(djpeg${suffix}-rgb-islow-565-cmp
    550       ${MD5CMP} ${MD5_BMP_RGB_ISLOW_565} testout_rgb_islow_565.bmp)
    551 
    552     # CC: RGB->RGB565 (dithered)  SAMP: fullsize  IDCT: islow  ENT: huff
    553     add_test(djpeg${suffix}-rgb-islow-565D
    554       ${dir}djpeg${suffix} -dct int -rgb565 -bmp
    555         -outfile testout_rgb_islow_565D.bmp testout_rgb_islow.jpg)
    556     add_test(djpeg${suffix}-rgb-islow-565D-cmp
    557       ${MD5CMP} ${MD5_BMP_RGB_ISLOW_565D} testout_rgb_islow_565D.bmp)
    558   endif()
    559 
    560   # CC: RGB->YCC  SAMP: fullsize/h2v1  FDCT: ifast  ENT: 2-pass huff
    561   add_test(cjpeg${suffix}-422-ifast-opt
    562     ${dir}cjpeg${suffix} -sample 2x1 -dct fast -opt
    563       -outfile testout_422_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
    564   add_test(cjpeg${suffix}-422-ifast-opt-cmp
    565     ${MD5CMP} ${MD5_JPEG_422_IFAST_OPT} testout_422_ifast_opt.jpg)
    566 
    567   # CC: YCC->RGB  SAMP: fullsize/h2v1 fancy  IDCT: ifast  ENT: huff
    568   add_test(djpeg${suffix}-422-ifast
    569     ${dir}djpeg${suffix} -dct fast
    570       -outfile testout_422_ifast.ppm testout_422_ifast_opt.jpg)
    571   add_test(djpeg${suffix}-422-ifast-cmp
    572     ${MD5CMP} ${MD5_PPM_422_IFAST} testout_422_ifast.ppm)
    573 
    574   # CC: YCC->RGB  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
    575   add_test(djpeg${suffix}-422m-ifast
    576     ${dir}djpeg${suffix} -dct fast -nosmooth
    577       -outfile testout_422m_ifast.ppm testout_422_ifast_opt.jpg)
    578   add_test(djpeg${suffix}-422m-ifast-cmp
    579     ${MD5CMP} ${MD5_PPM_422M_IFAST} testout_422m_ifast.ppm)
    580 
    581   if(NOT WITH_12BIT)
    582     # CC: YCC->RGB565  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
    583     add_test(djpeg${suffix}-422m-ifast-565
    584       ${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
    585         -outfile testout_422m_ifast_565.bmp testout_422_ifast_opt.jpg)
    586     add_test(djpeg${suffix}-422m-ifast-565-cmp
    587       ${MD5CMP} ${MD5_BMP_422M_IFAST_565} testout_422m_ifast_565.bmp)
    588 
    589     # CC: YCC->RGB565 (dithered)  SAMP: h2v1 merged  IDCT: ifast  ENT: huff
    590     add_test(djpeg${suffix}-422m-ifast-565D
    591       ${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
    592         -outfile testout_422m_ifast_565D.bmp testout_422_ifast_opt.jpg)
    593     add_test(djpeg${suffix}-422m-ifast-565D-cmp
    594       ${MD5CMP} ${MD5_BMP_422M_IFAST_565D} testout_422m_ifast_565D.bmp)
    595   endif()
    596 
    597   # CC: RGB->YCC  SAMP: fullsize/h2v2  FDCT: ifast  ENT: prog huff
    598   add_test(cjpeg${suffix}-420-q100-ifast-prog
    599     ${dir}cjpeg${suffix} -sample 2x2 -quality 100 -dct fast -prog
    600       -outfile testout_420_q100_ifast_prog.jpg ${TESTIMAGES}/testorig.ppm)
    601   add_test(cjpeg${suffix}-420-q100-ifast-prog-cmp
    602     ${MD5CMP} ${MD5_JPEG_420_IFAST_Q100_PROG} testout_420_q100_ifast_prog.jpg)
    603 
    604   # CC: YCC->RGB  SAMP: fullsize/h2v2 fancy  IDCT: ifast  ENT: prog huff
    605   add_test(djpeg${suffix}-420-q100-ifast-prog
    606     ${dir}djpeg${suffix} -dct fast
    607       -outfile testout_420_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
    608   add_test(djpeg${suffix}-420-q100-ifast-prog-cmp
    609     ${MD5CMP} ${MD5_PPM_420_Q100_IFAST} testout_420_q100_ifast.ppm)
    610 
    611   # CC: YCC->RGB  SAMP: h2v2 merged  IDCT: ifast  ENT: prog huff
    612   add_test(djpeg${suffix}-420m-q100-ifast-prog
    613     ${dir}djpeg${suffix} -dct fast -nosmooth
    614       -outfile testout_420m_q100_ifast.ppm testout_420_q100_ifast_prog.jpg)
    615   add_test(djpeg${suffix}-420m-q100-ifast-prog-cmp
    616     ${MD5CMP} ${MD5_PPM_420M_Q100_IFAST} testout_420m_q100_ifast.ppm)
    617 
    618   # CC: RGB->Gray  SAMP: fullsize  FDCT: islow  ENT: huff
    619   add_test(cjpeg${suffix}-gray-islow
    620     ${dir}cjpeg${suffix} -gray -dct int
    621       -outfile testout_gray_islow.jpg ${TESTIMAGES}/testorig.ppm)
    622   add_test(cjpeg${suffix}-gray-islow-cmp
    623     ${MD5CMP} ${MD5_JPEG_GRAY_ISLOW} testout_gray_islow.jpg)
    624 
    625   # CC: Gray->Gray  SAMP: fullsize  IDCT: islow  ENT: huff
    626   add_test(djpeg${suffix}-gray-islow
    627     ${dir}djpeg${suffix} -dct int
    628       -outfile testout_gray_islow.ppm testout_gray_islow.jpg)
    629   add_test(djpeg${suffix}-gray-islow-cmp
    630     ${MD5CMP} ${MD5_PPM_GRAY_ISLOW} testout_gray_islow.ppm)
    631 
    632   # CC: Gray->RGB  SAMP: fullsize  IDCT: islow  ENT: huff
    633   add_test(djpeg${suffix}-gray-islow-rgb
    634     ${dir}djpeg${suffix} -dct int -rgb
    635       -outfile testout_gray_islow_rgb.ppm testout_gray_islow.jpg)
    636   add_test(djpeg${suffix}-gray-islow-rgb-cmp
    637     ${MD5CMP} ${MD5_PPM_GRAY_ISLOW_RGB} testout_gray_islow_rgb.ppm)
    638 
    639   if(NOT WITH_12BIT)
    640     # CC: Gray->RGB565  SAMP: fullsize  IDCT: islow  ENT: huff
    641     add_test(djpeg${suffix}-gray-islow-565
    642       ${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
    643         -outfile testout_gray_islow_565.bmp testout_gray_islow.jpg)
    644     add_test(djpeg${suffix}-gray-islow-565-cmp
    645       ${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565} testout_gray_islow_565.bmp)
    646 
    647     # CC: Gray->RGB565 (dithered)  SAMP: fullsize  IDCT: islow  ENT: huff
    648     add_test(djpeg${suffix}-gray-islow-565D
    649       ${dir}djpeg${suffix} -dct int -rgb565 -bmp
    650         -outfile testout_gray_islow_565D.bmp testout_gray_islow.jpg)
    651     add_test(djpeg${suffix}-gray-islow-565D-cmp
    652       ${MD5CMP} ${MD5_BMP_GRAY_ISLOW_565D} testout_gray_islow_565D.bmp)
    653   endif()
    654 
    655   # CC: RGB->YCC  SAMP: fullsize smooth/h2v2 smooth  FDCT: islow
    656   # ENT: 2-pass huff
    657   add_test(cjpeg${suffix}-420s-ifast-opt
    658     ${dir}cjpeg${suffix} -sample 2x2 -smooth 1 -dct int -opt
    659       -outfile testout_420s_ifast_opt.jpg ${TESTIMAGES}/testorig.ppm)
    660   add_test(cjpeg${suffix}-420s-ifast-opt-cmp
    661     ${MD5CMP} ${MD5_JPEG_420S_IFAST_OPT} testout_420s_ifast_opt.jpg)
    662 
    663   # CC: RGB->YCC  SAMP: fullsize/int  FDCT: float  ENT: prog huff
    664   add_test(cjpeg${suffix}-3x2-float-prog
    665     ${dir}cjpeg${suffix} -sample 3x2 -dct float -prog
    666       -outfile testout_3x2_float_prog.jpg ${TESTIMAGES}/testorig.ppm)
    667   add_test(cjpeg${suffix}-3x2-float-prog-cmp
    668     ${MD5CMP} ${MD5_JPEG_3x2_FLOAT_PROG} testout_3x2_float_prog.jpg)
    669 
    670   # CC: YCC->RGB  SAMP: fullsize/int  IDCT: float  ENT: prog huff
    671   add_test(djpeg${suffix}-3x2-float-prog
    672     ${dir}djpeg${suffix} -dct float
    673       -outfile testout_3x2_float.ppm testout_3x2_float_prog.jpg)
    674   add_test(djpeg${suffix}-3x2-float-prog-cmp
    675     ${MD5CMP} ${MD5_PPM_3x2_FLOAT} testout_3x2_float.ppm)
    676 
    677   if(WITH_ARITH_ENC)
    678     # CC: YCC->RGB  SAMP: fullsize/h2v2  FDCT: islow  ENT: arith
    679     add_test(cjpeg${suffix}-420-islow-ari
    680       ${dir}cjpeg${suffix} -dct int -arithmetic
    681         -outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
    682     add_test(cjpeg${suffix}-420-islow-ari-cmp
    683       ${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
    684 
    685     add_test(jpegtran${suffix}-420-islow-ari
    686       ${dir}jpegtran${suffix} -arithmetic
    687         -outfile testout_420_islow_ari.jpg ${TESTIMAGES}/testimgint.jpg)
    688     add_test(jpegtran${suffix}-420-islow-ari-cmp
    689       ${MD5CMP} ${MD5_JPEG_420_ISLOW_ARI} testout_420_islow_ari.jpg)
    690 
    691     # CC: YCC->RGB  SAMP: fullsize  FDCT: islow  ENT: prog arith
    692     add_test(cjpeg${suffix}-444-islow-progari
    693       ${dir}cjpeg${suffix} -sample 1x1 -dct int -prog -arithmetic
    694         -outfile testout_444_islow_progari.jpg ${TESTIMAGES}/testorig.ppm)
    695     add_test(cjpeg${suffix}-444-islow-progari-cmp
    696       ${MD5CMP} ${MD5_JPEG_444_ISLOW_PROGARI} testout_444_islow_progari.jpg)
    697   endif()
    698 
    699   if(WITH_ARITH_DEC)
    700     # CC: RGB->YCC  SAMP: h2v2 merged  IDCT: ifast  ENT: arith
    701     add_test(djpeg${suffix}-420m-ifast-ari
    702       ${dir}djpeg${suffix} -fast -ppm
    703         -outfile testout_420m_ifast_ari.ppm ${TESTIMAGES}/testimgari.jpg)
    704     add_test(djpeg${suffix}-420m-ifast-ari-cmp
    705       ${MD5CMP} ${MD5_PPM_420M_IFAST_ARI} testout_420m_ifast_ari.ppm)
    706 
    707     add_test(jpegtran${suffix}-420-islow
    708       ${dir}jpegtran${suffix}
    709         -outfile testout_420_islow.jpg ${TESTIMAGES}/testimgari.jpg)
    710     add_test(jpegtran${suffix}-420-islow-cmp
    711       ${MD5CMP} ${MD5_JPEG_420_ISLOW} testout_420_islow.jpg)
    712   endif()
    713 
    714   # 2/1--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 16x16 islow  ENT: huff
    715   # 15/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 15x15 islow  ENT: huff
    716   # 13/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 13x13 islow  ENT: huff
    717   # 11/8--  CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 11x11 islow  ENT: huff
    718   # 9/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 9x9 islow  ENT: huff
    719   # 7/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 7x7 islow/14x14 islow
    720   #         ENT: huff
    721   # 3/4--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 6x6 islow/12x12 islow
    722   #         ENT: huff
    723   # 5/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 5x5 islow/10x10 islow
    724   #         ENT: huff
    725   # 1/2--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 4x4 islow/8x8 islow
    726   #         ENT: huff
    727   # 3/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 3x3 islow/6x6 islow
    728   #         ENT: huff
    729   # 1/4--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 2x2 islow/4x4 islow
    730   #         ENT: huff
    731   # 1/8--   CC: YCC->RGB  SAMP: h2v2 merged  IDCT: 1x1 islow/2x2 islow
    732   #         ENT: huff
    733   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)
    734     string(REGEX REPLACE "_" "/" scalearg ${scale})
    735     add_test(djpeg${suffix}-420m-islow-${scale}
    736       ${dir}djpeg${suffix} -dct int -scale ${scalearg} -nosmooth -ppm
    737         -outfile testout_420m_islow_${scale}.ppm ${TESTIMAGES}/${TESTORIG})
    738     add_test(djpeg${suffix}-420m-islow-${scale}-cmp
    739       ${MD5CMP} ${MD5_PPM_420M_ISLOW_${scale}} testout_420m_islow_${scale}.ppm)
    740   endforeach()
    741 
    742   if(NOT WITH_12BIT)
    743     # CC: YCC->RGB (dithered)  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
    744     add_test(djpeg${suffix}-420-islow-256
    745       ${dir}djpeg${suffix} -dct int -colors 256 -bmp
    746         -outfile testout_420_islow_256.bmp ${TESTIMAGES}/${TESTORIG})
    747     add_test(djpeg${suffix}-420-islow-256-cmp
    748       ${MD5CMP} ${MD5_BMP_420_ISLOW_256} testout_420_islow_256.bmp)
    749 
    750     # CC: YCC->RGB565  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
    751     add_test(djpeg${suffix}-420-islow-565
    752       ${dir}djpeg${suffix} -dct int -rgb565 -dither none -bmp
    753         -outfile testout_420_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
    754     add_test(djpeg${suffix}-420-islow-565-cmp
    755       ${MD5CMP} ${MD5_BMP_420_ISLOW_565} testout_420_islow_565.bmp)
    756 
    757     # CC: YCC->RGB565 (dithered)  SAMP: h2v2 fancy  IDCT: islow  ENT: huff
    758     add_test(djpeg${suffix}-420-islow-565D
    759       ${dir}djpeg${suffix} -dct int -rgb565 -bmp
    760         -outfile testout_420_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
    761     add_test(djpeg${suffix}-420-islow-565D-cmp
    762       ${MD5CMP} ${MD5_BMP_420_ISLOW_565D} testout_420_islow_565D.bmp)
    763 
    764     # CC: YCC->RGB565  SAMP: h2v2 merged  IDCT: islow  ENT: huff
    765     add_test(djpeg${suffix}-420m-islow-565
    766       ${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -dither none -bmp
    767         -outfile testout_420m_islow_565.bmp ${TESTIMAGES}/${TESTORIG})
    768     add_test(djpeg${suffix}-420m-islow-565-cmp
    769       ${MD5CMP} ${MD5_BMP_420M_ISLOW_565} testout_420m_islow_565.bmp)
    770 
    771     # CC: YCC->RGB565 (dithered)  SAMP: h2v2 merged  IDCT: islow  ENT: huff
    772     add_test(djpeg${suffix}-420m-islow-565D
    773       ${dir}djpeg${suffix} -dct int -nosmooth -rgb565 -bmp
    774         -outfile testout_420m_islow_565D.bmp ${TESTIMAGES}/${TESTORIG})
    775     add_test(djpeg${suffix}-420m-islow-565D-cmp
    776       ${MD5CMP} ${MD5_BMP_420M_ISLOW_565D} testout_420m_islow_565D.bmp)
    777   endif()
    778 
    779   # Partial decode tests.  These tests are designed to cover all of the
    780   # possible code paths in jpeg_skip_scanlines().
    781 
    782   # Context rows: Yes  Intra-iMCU row: Yes  iMCU row prefetch: No   ENT: huff
    783   add_test(djpeg${suffix}-420-islow-skip15_31
    784     ${dir}djpeg${suffix} -dct int -skip 15,31 -ppm
    785       -outfile testout_420_islow_skip15,31.ppm ${TESTIMAGES}/${TESTORIG})
    786   add_test(djpeg${suffix}-420-islow-skip15_31-cmp
    787     ${MD5CMP} ${MD5_PPM_420_ISLOW_SKIP15_31} testout_420_islow_skip15,31.ppm)
    788 
    789   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: Yes  ENT: arith
    790   if(WITH_ARITH_DEC)
    791     add_test(djpeg${suffix}-420-islow-ari-skip16_139
    792       ${dir}djpeg${suffix} -dct int -skip 16,139 -ppm
    793         -outfile testout_420_islow_ari_skip16,139.ppm
    794         ${TESTIMAGES}/testimgari.jpg)
    795     add_test(djpeg${suffix}-420-islow-ari_skip16_139-cmp
    796       ${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_SKIP16_139}
    797         testout_420_islow_ari_skip16,139.ppm)
    798   endif()
    799 
    800   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: No   ENT: prog huff
    801   add_test(cjpeg${suffix}-420-islow-prog
    802     ${dir}cjpeg${suffix} -dct int -prog
    803       -outfile testout_420_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
    804   add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71
    805     ${dir}djpeg${suffix} -dct int -crop 62x62+71+71 -ppm
    806       -outfile testout_420_islow_prog_crop62x62,71,71.ppm
    807       testout_420_islow_prog.jpg)
    808   add_test(djpeg${suffix}-420-islow-prog-crop62x62_71_71-cmp
    809     ${MD5CMP} ${MD5_PPM_420_ISLOW_PROG_CROP62x62_71_71}
    810       testout_420_islow_prog_crop62x62,71,71.ppm)
    811 
    812   # Context rows: Yes  Intra-iMCU row: No   iMCU row prefetch: No   ENT: arith
    813   if(WITH_ARITH_DEC)
    814     add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4
    815       ${dir}djpeg${suffix} -dct int -crop 53x53+4+4 -ppm
    816         -outfile testout_420_islow_ari_crop53x53,4,4.ppm
    817         ${TESTIMAGES}/testimgari.jpg)
    818     add_test(djpeg${suffix}-420-islow-ari-crop53x53_4_4-cmp
    819       ${MD5CMP} ${MD5_PPM_420_ISLOW_ARI_CROP53x53_4_4}
    820         testout_420_islow_ari_crop53x53,4,4.ppm)
    821   endif()
    822 
    823   # Context rows: No   Intra-iMCU row: Yes  ENT: huff
    824   add_test(cjpeg${suffix}-444-islow
    825     ${dir}cjpeg${suffix} -dct int -sample 1x1
    826       -outfile testout_444_islow.jpg ${TESTIMAGES}/testorig.ppm)
    827   add_test(djpeg${suffix}-444-islow-skip1_6
    828     ${dir}djpeg${suffix} -dct int -skip 1,6 -ppm
    829       -outfile testout_444_islow_skip1,6.ppm testout_444_islow.jpg)
    830   add_test(djpeg${suffix}-444-islow-skip1_6-cmp
    831     ${MD5CMP} ${MD5_PPM_444_ISLOW_SKIP1_6} testout_444_islow_skip1,6.ppm)
    832 
    833   # Context rows: No   Intra-iMCU row: No   ENT: prog huff
    834   add_test(cjpeg${suffix}-444-islow-prog
    835     ${dir}cjpeg${suffix} -dct int -prog -sample 1x1
    836       -outfile testout_444_islow_prog.jpg ${TESTIMAGES}/testorig.ppm)
    837   add_test(djpeg${suffix}-444-islow-prog-crop98x98_13_13
    838     ${dir}djpeg${suffix} -dct int -crop 98x98+13+13 -ppm
    839       -outfile testout_444_islow_prog_crop98x98,13,13.ppm
    840       testout_444_islow_prog.jpg)
    841   add_test(djpeg${suffix}-444-islow-prog_crop98x98_13_13-cmp
    842     ${MD5CMP} ${MD5_PPM_444_ISLOW_PROG_CROP98x98_13_13}
    843       testout_444_islow_prog_crop98x98,13,13.ppm)
    844 
    845   # Context rows: No   Intra-iMCU row: No   ENT: arith
    846   if(WITH_ARITH_ENC)
    847     add_test(cjpeg${suffix}-444-islow-ari
    848       ${dir}cjpeg${suffix} -dct int -arithmetic -sample 1x1
    849         -outfile testout_444_islow_ari.jpg ${TESTIMAGES}/testorig.ppm)
    850     if(WITH_ARITH_DEC)
    851       add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0
    852         ${dir}djpeg${suffix} -dct int -crop 37x37+0+0 -ppm
    853           -outfile testout_444_islow_ari_crop37x37,0,0.ppm
    854           testout_444_islow_ari.jpg)
    855       add_test(djpeg${suffix}-444-islow-ari-crop37x37_0_0-cmp
    856         ${MD5CMP} ${MD5_PPM_444_ISLOW_ARI_CROP37x37_0_0}
    857           testout_444_islow_ari_crop37x37,0,0.ppm)
    858     endif()
    859   endif()
    860 
    861   add_test(jpegtran${suffix}-crop
    862     ${dir}jpegtran${suffix} -crop 120x90+20+50 -transpose -perfect
    863       -outfile testout_crop.jpg ${TESTIMAGES}/${TESTORIG})
    864   add_test(jpegtran${suffix}-crop-cmp
    865     ${MD5CMP} ${MD5_JPEG_CROP} testout_crop.jpg)
    866 
    867 endforeach()
    868 
    869 add_custom_target(testclean COMMAND ${CMAKE_COMMAND} -P
    870   ${CMAKE_SOURCE_DIR}/cmakescripts/testclean.cmake)
    871 
    872 
    873 #
    874 # Installer
    875 #
    876 
    877 if(MSVC)
    878   set(INST_PLATFORM "Visual C++")
    879   set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-vc)
    880   set(INST_REG_NAME ${CMAKE_PROJECT_NAME})
    881 elseif(MINGW)
    882   set(INST_PLATFORM GCC)
    883   set(INST_NAME ${CMAKE_PROJECT_NAME}-${VERSION}-gcc)
    884   set(INST_REG_NAME ${CMAKE_PROJECT_NAME}-gcc)
    885   set(INST_DEFS -DGCC)
    886 endif()
    887 
    888 if(64BIT)
    889   set(INST_PLATFORM "${INST_PLATFORM} 64-bit")
    890   set(INST_NAME ${INST_NAME}64)
    891   set(INST_REG_NAME ${INST_DIR}64)
    892   set(INST_DEFS ${INST_DEFS} -DWIN64)
    893 endif()
    894 
    895 if(WITH_JAVA)
    896   set(INST_DEFS ${INST_DEFS} -DJAVA)
    897 endif()
    898 
    899 if(MSVC_IDE)
    900   set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=${CMAKE_CFG_INTDIR}\\")
    901 else()
    902   set(INST_DEFS ${INST_DEFS} "-DBUILDDIR=")
    903 endif()
    904 
    905 STRING(REGEX REPLACE "/" "\\\\" INST_DIR ${CMAKE_INSTALL_PREFIX})
    906 
    907 configure_file(release/libjpeg-turbo.nsi.in libjpeg-turbo.nsi @ONLY)
    908 
    909 if(WITH_JAVA)
    910   set(JAVA_DEPEND java)
    911 endif()
    912 add_custom_target(installer
    913   makensis -nocd ${INST_DEFS} libjpeg-turbo.nsi
    914   DEPENDS jpeg jpeg-static turbojpeg turbojpeg-static rdjpgcom wrjpgcom
    915     cjpeg djpeg jpegtran tjbench ${JAVA_DEPEND}
    916   SOURCES libjpeg-turbo.nsi)
    917 
    918 if(WITH_TURBOJPEG)
    919   if(ENABLE_SHARED)
    920     install(TARGETS turbojpeg tjbench
    921       ARCHIVE DESTINATION lib
    922       LIBRARY DESTINATION lib
    923       RUNTIME DESTINATION bin)
    924   endif()
    925   if(ENABLE_STATIC)
    926     install(TARGETS turbojpeg-static ARCHIVE DESTINATION lib)
    927     if(NOT ENABLE_SHARED)
    928       install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/tjbench-static.exe
    929         DESTINATION bin RENAME tjbench.exe)
    930     endif()
    931   endif()
    932   install(FILES ${CMAKE_SOURCE_DIR}/turbojpeg.h DESTINATION include)
    933 endif()
    934 
    935 if(ENABLE_STATIC)
    936   install(TARGETS jpeg-static ARCHIVE DESTINATION lib)
    937   if(NOT ENABLE_SHARED)
    938     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/cjpeg-static.exe
    939       DESTINATION bin RENAME cjpeg.exe)
    940     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/djpeg-static.exe
    941       DESTINATION bin RENAME djpeg.exe)
    942     install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/jpegtran-static.exe
    943       DESTINATION bin RENAME jpegtran.exe)
    944   endif()
    945 endif()
    946 
    947 install(TARGETS rdjpgcom wrjpgcom RUNTIME DESTINATION bin)
    948 
    949 install(FILES ${CMAKE_SOURCE_DIR}/README.ijg ${CMAKE_SOURCE_DIR}/README.md
    950   ${CMAKE_SOURCE_DIR}/example.c ${CMAKE_SOURCE_DIR}/libjpeg.txt
    951   ${CMAKE_SOURCE_DIR}/structure.txt ${CMAKE_SOURCE_DIR}/usage.txt
    952   ${CMAKE_SOURCE_DIR}/wizard.txt
    953   DESTINATION doc)
    954 
    955 install(FILES ${CMAKE_BINARY_DIR}/jconfig.h ${CMAKE_SOURCE_DIR}/jerror.h
    956   ${CMAKE_SOURCE_DIR}/jmorecfg.h ${CMAKE_SOURCE_DIR}/jpeglib.h
    957   DESTINATION include)
    958 
    959 configure_file("${CMAKE_SOURCE_DIR}/cmakescripts/cmake_uninstall.cmake.in"
    960   "cmake_uninstall.cmake" IMMEDIATE @ONLY)
    961 
    962 add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P cmake_uninstall.cmake)
    963