1# ----------------------------------------------------------------------------
2#  Detect 3rd-party image IO libraries
3# ----------------------------------------------------------------------------
4
5# --- zlib (required) ---
6if(BUILD_ZLIB)
7  ocv_clear_vars(ZLIB_FOUND)
8else()
9  ocv_clear_internal_cache_vars(ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
10  if(ANDROID)
11    set(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
12    set(CMAKE_FIND_LIBRARY_SUFFIXES .so)
13  endif()
14  find_package(ZLIB "${MIN_VER_ZLIB}")
15  if(ANDROID)
16    set(CMAKE_FIND_LIBRARY_SUFFIXES ${_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})
17    unset(_zlib_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)
18  endif()
19  if(ZLIB_FOUND AND ANDROID)
20    if(ZLIB_LIBRARIES MATCHES "/usr/lib.*/libz.so$")
21      set(ZLIB_LIBRARIES z)
22    endif()
23  endif()
24endif()
25
26if(NOT ZLIB_FOUND)
27  ocv_clear_vars(ZLIB_LIBRARY ZLIB_LIBRARIES ZLIB_INCLUDE_DIR)
28
29  set(ZLIB_LIBRARY zlib CACHE INTERNAL "")
30  add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/zlib")
31  set(ZLIB_INCLUDE_DIR "${${ZLIB_LIBRARY}_SOURCE_DIR}" "${${ZLIB_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
32  set(ZLIB_INCLUDE_DIRS ${ZLIB_INCLUDE_DIR})
33  set(ZLIB_LIBRARIES ${ZLIB_LIBRARY})
34
35  ocv_parse_header2(ZLIB "${${ZLIB_LIBRARY}_SOURCE_DIR}/zlib.h" ZLIB_VERSION)
36endif()
37
38# --- libjpeg (optional) ---
39if(WITH_JPEG)
40  if(BUILD_JPEG)
41    ocv_clear_vars(JPEG_FOUND)
42  else()
43    ocv_clear_internal_cache_vars(JPEG_LIBRARY JPEG_INCLUDE_DIR)
44    include(FindJPEG)
45  endif()
46
47  if(NOT JPEG_FOUND)
48    ocv_clear_vars(JPEG_LIBRARY JPEG_INCLUDE_DIR)
49
50    if(NOT BUILD_JPEG_TURBO_DISABLE)
51      set(JPEG_LIBRARY libjpeg-turbo CACHE INTERNAL "")
52      set(JPEG_LIBRARIES ${JPEG_LIBRARY})
53      add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjpeg-turbo")
54      set(JPEG_INCLUDE_DIR "${${JPEG_LIBRARY}_SOURCE_DIR}/src" CACHE INTERNAL "")
55    else()
56      set(JPEG_LIBRARY libjpeg CACHE INTERNAL "")
57      set(JPEG_LIBRARIES ${JPEG_LIBRARY})
58      add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjpeg")
59      set(JPEG_INCLUDE_DIR "${${JPEG_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
60    endif()
61    set(JPEG_INCLUDE_DIRS "${JPEG_INCLUDE_DIR}")
62  endif()
63
64  macro(ocv_detect_jpeg_version header_file)
65    if(NOT DEFINED JPEG_LIB_VERSION AND EXISTS "${header_file}")
66      ocv_parse_header("${header_file}" JPEG_VERSION_LINES JPEG_LIB_VERSION)
67    endif()
68  endmacro()
69  ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jpeglib.h")
70  if(DEFINED CMAKE_CXX_LIBRARY_ARCHITECTURE)
71    ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/${CMAKE_CXX_LIBRARY_ARCHITECTURE}/jconfig.h")
72  endif()
73  # no needed for strict platform check here, both files 64/32 should contain the same version
74  ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig-64.h")
75  ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig-32.h")
76  ocv_detect_jpeg_version("${JPEG_INCLUDE_DIR}/jconfig.h")
77  ocv_detect_jpeg_version("${${JPEG_LIBRARY}_BINARY_DIR}/jconfig.h")
78  if(NOT DEFINED JPEG_LIB_VERSION)
79    set(JPEG_LIB_VERSION "unknown")
80  endif()
81  set(HAVE_JPEG YES)
82endif()
83
84# --- libtiff (optional, should be searched after zlib and libjpeg) ---
85if(WITH_TIFF)
86  if(BUILD_TIFF)
87    ocv_clear_vars(TIFF_FOUND)
88  else()
89    ocv_clear_internal_cache_vars(TIFF_LIBRARY TIFF_INCLUDE_DIR)
90    include(FindTIFF)
91    if(TIFF_FOUND)
92      ocv_parse_header("${TIFF_INCLUDE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
93    endif()
94  endif()
95
96  if(NOT TIFF_FOUND)
97    ocv_clear_vars(TIFF_LIBRARY TIFF_LIBRARIES TIFF_INCLUDE_DIR)
98
99    set(TIFF_LIBRARY libtiff CACHE INTERNAL "")
100    set(TIFF_LIBRARIES ${TIFF_LIBRARY})
101    add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libtiff")
102    set(TIFF_INCLUDE_DIR "${${TIFF_LIBRARY}_SOURCE_DIR}" "${${TIFF_LIBRARY}_BINARY_DIR}" CACHE INTERNAL "")
103    ocv_parse_header("${${TIFF_LIBRARY}_SOURCE_DIR}/tiff.h" TIFF_VERSION_LINES TIFF_VERSION_CLASSIC TIFF_VERSION_BIG TIFF_VERSION TIFF_BIGTIFF_VERSION)
104  endif()
105
106  if(TIFF_VERSION_CLASSIC AND NOT TIFF_VERSION)
107    set(TIFF_VERSION ${TIFF_VERSION_CLASSIC})
108  endif()
109
110  if(TIFF_BIGTIFF_VERSION AND NOT TIFF_VERSION_BIG)
111    set(TIFF_VERSION_BIG ${TIFF_BIGTIFF_VERSION})
112  endif()
113
114  if(NOT TIFF_VERSION_STRING AND TIFF_INCLUDE_DIR)
115    list(GET TIFF_INCLUDE_DIR 0 _TIFF_INCLUDE_DIR)
116    if(EXISTS "${_TIFF_INCLUDE_DIR}/tiffvers.h")
117      file(STRINGS "${_TIFF_INCLUDE_DIR}/tiffvers.h" tiff_version_str REGEX "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version .*")
118      string(REGEX REPLACE "^#define[\t ]+TIFFLIB_VERSION_STR[\t ]+\"LIBTIFF, Version +([^ \\n]*).*" "\\1" TIFF_VERSION_STRING "${tiff_version_str}")
119      unset(tiff_version_str)
120    endif()
121    unset(_TIFF_INCLUDE_DIR)
122  endif()
123
124  set(HAVE_TIFF YES)
125endif()
126
127# --- libwebp (optional) ---
128
129if(WITH_WEBP)
130  if(BUILD_WEBP)
131    ocv_clear_vars(WEBP_FOUND WEBP_LIBRARY WEBP_LIBRARIES WEBP_INCLUDE_DIR)
132  else()
133    ocv_clear_internal_cache_vars(WEBP_LIBRARY WEBP_INCLUDE_DIR)
134    include(cmake/OpenCVFindWebP.cmake)
135    if(WEBP_FOUND)
136      set(HAVE_WEBP 1)
137    endif()
138  endif()
139endif()
140
141# --- Add libwebp to 3rdparty/libwebp and compile it if not available ---
142if(WITH_WEBP AND NOT WEBP_FOUND
143    AND (NOT ANDROID OR HAVE_CPUFEATURES)
144)
145  ocv_clear_vars(WEBP_LIBRARY WEBP_INCLUDE_DIR)
146  set(WEBP_LIBRARY libwebp CACHE INTERNAL "")
147  set(WEBP_LIBRARIES ${WEBP_LIBRARY})
148
149  add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libwebp")
150  set(WEBP_INCLUDE_DIR "${${WEBP_LIBRARY}_SOURCE_DIR}/src" CACHE INTERNAL "")
151  set(HAVE_WEBP 1)
152endif()
153
154if(NOT WEBP_VERSION AND WEBP_INCLUDE_DIR)
155  ocv_clear_vars(ENC_MAJ_VERSION ENC_MIN_VERSION ENC_REV_VERSION)
156  if(EXISTS "${WEBP_INCLUDE_DIR}/enc/vp8enci.h")
157    ocv_parse_header("${WEBP_INCLUDE_DIR}/enc/vp8enci.h" WEBP_VERSION_LINES ENC_MAJ_VERSION ENC_MIN_VERSION ENC_REV_VERSION)
158    set(WEBP_VERSION "${ENC_MAJ_VERSION}.${ENC_MIN_VERSION}.${ENC_REV_VERSION}")
159  elseif(EXISTS "${WEBP_INCLUDE_DIR}/webp/encode.h")
160    file(STRINGS "${WEBP_INCLUDE_DIR}/webp/encode.h" WEBP_ENCODER_ABI_VERSION REGEX "#define[ \t]+WEBP_ENCODER_ABI_VERSION[ \t]+([x0-9a-f]+)" )
161    if(WEBP_ENCODER_ABI_VERSION MATCHES "#define[ \t]+WEBP_ENCODER_ABI_VERSION[ \t]+([x0-9a-f]+)")
162        set(WEBP_ENCODER_ABI_VERSION "${CMAKE_MATCH_1}")
163        set(WEBP_VERSION "encoder: ${WEBP_ENCODER_ABI_VERSION}")
164    else()
165      unset(WEBP_ENCODER_ABI_VERSION)
166    endif()
167  endif()
168endif()
169
170# --- libopenjp2 (optional, check before libjasper) ---
171if(WITH_OPENJPEG)
172  if(BUILD_OPENJPEG)
173    ocv_clear_vars(OpenJPEG_FOUND)
174  else()
175    find_package(OpenJPEG QUIET)
176  endif()
177
178  if(NOT OpenJPEG_FOUND OR OPENJPEG_MAJOR_VERSION LESS 2)
179    ocv_clear_vars(OPENJPEG_MAJOR_VERSION OPENJPEG_MINOR_VERSION OPENJPEG_BUILD_VERSION OPENJPEG_LIBRARIES OPENJPEG_INCLUDE_DIRS)
180    message(STATUS "Could NOT find OpenJPEG (minimal suitable version: 2.0, "
181            "recommended version >= 2.3.1). OpenJPEG will be built from sources")
182    add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openjpeg")
183    if(OCV_CAN_BUILD_OPENJPEG)
184      set(HAVE_OPENJPEG YES)
185      message(STATUS "OpenJPEG libraries will be built from sources: ${OPENJPEG_LIBRARIES} "
186              "(version \"${OPENJPEG_VERSION}\")")
187    else()
188      set(HAVE_OPENJPEG NO)
189      message(STATUS "OpenJPEG libraries can't be built from sources. System requirements are not fulfilled.")
190    endif()
191  else()
192    set(HAVE_OPENJPEG YES)
193    message(STATUS "Found system OpenJPEG: ${OPENJPEG_LIBRARIES} "
194            "(found version \"${OPENJPEG_VERSION}\")")
195  endif()
196endif()
197
198# --- libjasper (optional, should be searched after libjpeg) ---
199if(WITH_JASPER AND NOT HAVE_OPENJPEG)
200  if(BUILD_JASPER)
201    ocv_clear_vars(JASPER_FOUND)
202  else()
203    include(FindJasper)
204  endif()
205
206  if(NOT JASPER_FOUND)
207    ocv_clear_vars(JASPER_LIBRARY JASPER_LIBRARIES JASPER_INCLUDE_DIR)
208
209    set(JASPER_LIBRARY libjasper CACHE INTERNAL "")
210    set(JASPER_LIBRARIES ${JASPER_LIBRARY})
211    add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libjasper")
212    set(JASPER_INCLUDE_DIR "${${JASPER_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
213  endif()
214
215  set(HAVE_JASPER YES)
216
217  if(NOT JASPER_VERSION_STRING)
218    ocv_parse_header2(JASPER "${JASPER_INCLUDE_DIR}/jasper/jas_config.h" JAS_VERSION "")
219  endif()
220endif()
221
222# --- libpng (optional, should be searched after zlib) ---
223if(WITH_PNG)
224  if(BUILD_PNG)
225    ocv_clear_vars(PNG_FOUND)
226  else()
227    ocv_clear_internal_cache_vars(PNG_LIBRARY PNG_INCLUDE_DIR)
228    include(FindPNG)
229    if(PNG_FOUND)
230      include(CheckIncludeFile)
231      check_include_file("${PNG_PNG_INCLUDE_DIR}/libpng16/png.h" HAVE_LIBPNG_PNG_H)
232      if(HAVE_LIBPNG_PNG_H)
233        ocv_parse_header("${PNG_PNG_INCLUDE_DIR}/libpng16/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
234      else()
235        ocv_parse_header("${PNG_PNG_INCLUDE_DIR}/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
236      endif()
237    endif()
238  endif()
239
240  if(NOT PNG_FOUND)
241    ocv_clear_vars(PNG_LIBRARY PNG_LIBRARIES PNG_INCLUDE_DIR PNG_PNG_INCLUDE_DIR HAVE_LIBPNG_PNG_H PNG_DEFINITIONS)
242
243    set(PNG_LIBRARY libpng CACHE INTERNAL "")
244    set(PNG_LIBRARIES ${PNG_LIBRARY})
245    add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/libpng")
246    set(PNG_INCLUDE_DIR "${${PNG_LIBRARY}_SOURCE_DIR}" CACHE INTERNAL "")
247    set(PNG_DEFINITIONS "")
248    ocv_parse_header("${PNG_INCLUDE_DIR}/png.h" PNG_VERSION_LINES PNG_LIBPNG_VER_MAJOR PNG_LIBPNG_VER_MINOR PNG_LIBPNG_VER_RELEASE)
249  endif()
250
251  set(HAVE_PNG YES)
252  set(PNG_VERSION "${PNG_LIBPNG_VER_MAJOR}.${PNG_LIBPNG_VER_MINOR}.${PNG_LIBPNG_VER_RELEASE}")
253endif()
254
255# --- OpenEXR (optional) ---
256if(WITH_OPENEXR)
257  ocv_clear_vars(HAVE_OPENEXR)
258  if(NOT BUILD_OPENEXR)
259    ocv_clear_internal_cache_vars(OPENEXR_INCLUDE_PATHS OPENEXR_LIBRARIES OPENEXR_ILMIMF_LIBRARY OPENEXR_VERSION)
260    include("${OpenCV_SOURCE_DIR}/cmake/OpenCVFindOpenEXR.cmake")
261  endif()
262
263  if(OPENEXR_FOUND)
264    set(HAVE_OPENEXR YES)
265  else()
266    ocv_clear_vars(OPENEXR_INCLUDE_PATHS OPENEXR_LIBRARIES OPENEXR_ILMIMF_LIBRARY OPENEXR_VERSION)
267
268    set(OPENEXR_LIBRARIES IlmImf)
269    add_subdirectory("${OpenCV_SOURCE_DIR}/3rdparty/openexr")
270    if(OPENEXR_VERSION)  # check via TARGET doesn't work
271      set(HAVE_OPENEXR YES)
272    endif()
273  endif()
274endif()
275
276# --- GDAL (optional) ---
277if(WITH_GDAL)
278    find_package(GDAL QUIET)
279
280    if(NOT GDAL_FOUND)
281        set(HAVE_GDAL NO)
282        ocv_clear_vars(GDAL_VERSION GDAL_LIBRARIES)
283    else()
284        set(HAVE_GDAL YES)
285        ocv_include_directories(${GDAL_INCLUDE_DIR})
286    endif()
287endif()
288
289if(WITH_GDCM)
290  find_package(GDCM QUIET)
291  if(NOT GDCM_FOUND)
292    set(HAVE_GDCM NO)
293    ocv_clear_vars(GDCM_VERSION GDCM_LIBRARIES)
294  else()
295    set(HAVE_GDCM YES)
296    # include(${GDCM_USE_FILE})
297    set(GDCM_LIBRARIES gdcmMSFF) # GDCM does not set this variable for some reason
298  endif()
299endif()
300
301if(WITH_IMGCODEC_HDR)
302  set(HAVE_IMGCODEC_HDR ON)
303elseif(DEFINED WITH_IMGCODEC_HDR)
304  set(HAVE_IMGCODEC_HDR OFF)
305endif()
306if(WITH_IMGCODEC_SUNRASTER)
307  set(HAVE_IMGCODEC_SUNRASTER ON)
308elseif(DEFINED WITH_IMGCODEC_SUNRASTER)
309  set(HAVE_IMGCODEC_SUNRASTER OFF)
310endif()
311if(WITH_IMGCODEC_PXM)
312  set(HAVE_IMGCODEC_PXM ON)
313elseif(DEFINED WITH_IMGCODEC_PXM)
314  set(HAVE_IMGCODEC_PXM OFF)
315endif()
316if(WITH_IMGCODEC_PFM)
317  set(HAVE_IMGCODEC_PFM ON)
318elseif(DEFINED WITH_IMGCODEC_PFM)
319  set(HAVE_IMGCODEC_PFM OFF)
320endif()
321