####################################################################
#
# Aliza MS
#
####################################################################

cmake_minimum_required(VERSION 3.11.0)
#
# Note, for CMAKE_CXX_STANDARD:
# For C++20 version 3.12 is required.
# For C++23 version 3.20 is required.
# For C++26 version 3.25 is required.
# A compiler should support at least C++14.
#

####################################################################
#
#
#
#

# https://cmake.org/cmake/help/v3.0/policy/CMP0003.html
# Libraries linked via full path no longer produce linker search paths
cmake_policy(SET CMP0003 NEW)

# https://cmake.org/cmake/help/v3.0/policy/CMP0022.html
# Link
if(POLICY CMP0022)
  cmake_policy(SET CMP0022 NEW)
endif()

# https://cmake.org/cmake/help/v3.0/policy/CMP0025.html
# AppleClang
if(POLICY CMP0025)
  cmake_policy(SET CMP0025 NEW)
endif()

# https://cmake.org/cmake/help/v3.6/policy/CMP0026.html
# Disallow LOCATION property
if(POLICY CMP0026)
  cmake_policy(SET CMP0026 NEW)
endif()

# https://cmake.org/cmake/help/v3.0/policy/CMP0042.html
# MACOSX_RPATH is enabled by default
if(POLICY CMP0042)
  cmake_policy(SET CMP0042 NEW)
endif()

# https://cmake.org/cmake/help/v3.3/policy/CMP0063.html
# Honor visibility properties for all target types.
if(POLICY CMP0063)
  cmake_policy(SET CMP0063 NEW)
endif()

# https://cmake.org/cmake/help/v3.19/policy/CMP0072.html
# FindOpenGL prefers GLVND by default when available.
# https://cmake.org/cmake/help/v3.19/module/FindOpenGL.html
if (POLICY CMP0072)
  cmake_policy(SET CMP0072 NEW)
endif()
#
#
#
#
####################################################################

project(ALIZAMS)

####################################################################
#
#
# Options
#
#
#
if(APPLE)
  set(ALIZAMS_OSX_BUNDLE_VERSION "1.9.10")
endif()

# Qt major version, required.
set(ALIZA_QT_VERSION "QT_VERSION_NOT_SELECTED" CACHE STRING "Qt major version")
set_property(CACHE ALIZA_QT_VERSION PROPERTY STRINGS "QT_VERSION_NOT_SELECTED" "4" "5" "6")

# There is no guarantee that the option will work,
# check "__cplusplus" (s. main.cpp PRINT_HOST_INFO define).
set(ALIZA_CXX_STANDARD "Not set" CACHE STRING "Select C++ standard, usually not requied")
set_property(CACHE ALIZA_CXX_STANDARD PROPERTY STRINGS "Not set" "14" "17" "20" "23" "26")

# Force-disable SSE/SSE2.
option(ALIZA_DISABLE_SIMDMATH "Disable SSE/SSE2" OFF)

if(NOT APPLE)
  # Use OpenGL Core profile.
  option(ALIZA_COREGL "Use OpenGL Core Profile" ON)
endif()

if(UNIX AND NOT APPLE)
  # Force xcb platform on Linux.
  # Another platform still can be set with an argument, e.g. "alizams -platform vnc".
  option(ALIZA_QT5_6_PLATFORM_XCB "Force QT_QPA_PLATFORM=xcb (only Qt5 and Qt6)" ON)
  option(ALIZA_QT4_SYSTEM_GLEW "Use system GLEW (only Qt4)" OFF)
  option(ALIZA_USE_SYSTEM_BULLET "Use system Bullet" OFF)
  option(ALIZA_USE_SYSTEM_LCMS2 "Use system lcms2" OFF)
endif()

# Only for build to be shipped on media.
option(ALIZA_MEDIASTORAGE_MODE "Build for media storage" OFF)
mark_as_advanced(ALIZA_MEDIASTORAGE_MODE)

option(ALIZA_VERBOSE "Print messages to std::cout" OFF)

# Temporary
set(TMP_USE_53_SPATIAL_ENUMS TRUE)

#
#
# MDCM
#
#

if(WIN32)
  option(MDCM_USE_WIN32_UNC "Unicode, long file path (Windows)" ON)
endif()

option(MDCM_USE_SYSTEM_ZLIB "Use system zlib" OFF)

if(UNIX AND NOT APPLE)
  option(MDCM_USE_SYSTEM_UUID "Use system uuid" OFF)
endif()

option(MDCM_USE_SYSTEM_OPENJPEG "Use system OpenJPEG" OFF)

option(MDCM_USE_SYSTEM_CHARLS "Use system CharLS" OFF)

if(FALSE)
#
# OpenSSL is currently not used, don't enable!
#
  option(MDCM_USE_SYSTEM_OPENSSL "Use system OpenSSL" OFF)
  mark_as_advanced(MDCM_USE_SYSTEM_OPENSSL)
endif()
#
#
#
#
#
#
####################################################################

message(STATUS "System processor: " ${CMAKE_SYSTEM_PROCESSOR})
message(STATUS "System name: " ${CMAKE_SYSTEM_NAME})

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/CMake")

if(NOT EXECUTABLE_OUTPUT_PATH)
  set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin CACHE PATH "Output directory for executables")
  mark_as_advanced(EXECUTABLE_OUTPUT_PATH)
endif()
if(NOT LIBRARY_OUTPUT_PATH)
  set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/bin CACHE PATH "Output directory for libraries")
  mark_as_advanced(LIBRARY_OUTPUT_PATH)
endif()

set(tmp0_build_type "None")
if(CMAKE_BUILD_TYPE)
  set(tmp0_build_type "${CMAKE_BUILD_TYPE}")
endif()
string(TOUPPER ${tmp0_build_type} tmp1_build_type)
if(${tmp1_build_type} STREQUAL "DEBUG")
  add_definitions(-D_DEBUG)
else()
  add_definitions(-DNDEBUG)
endif()

# Required for x86 32 bit GCC build only.
if(NOT WIN32)
  if(NOT (CMAKE_SIZEOF_VOID_P EQUAL 8))
    if(NOT ALIZA_DISABLE_SIMDMATH)
      if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "i686")
        set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -msse2")
        set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -msse2")
      endif()
    endif()
  endif()
endif()
message(STATUS "CXX flags: " ${CMAKE_CXX_FLAGS})

if(ALIZA_QT_VERSION STREQUAL "4")
  set(USE_QT_V_4 TRUE)
  message(STATUS "Using Qt4")
elseif(ALIZA_QT_VERSION STREQUAL "5")
  set(USE_QT_V_5 TRUE)
  message(STATUS "Using Qt5")
elseif(ALIZA_QT_VERSION STREQUAL "6")
  set(USE_QT_V_6 TRUE)
  message(STATUS "Using Qt6")
else()
  message(FATAL_ERROR "Can not determine Qt version to use")
endif()

if(ALIZA_CXX_STANDARD STREQUAL "Not set")
else()
  if(ALIZA_CXX_STANDARD STREQUAL "14")
    set(CMAKE_CXX_STANDARD 14)
    message(STATUS "Tried to set C++14")
  elseif(ALIZA_CXX_STANDARD STREQUAL "17")
    set(CMAKE_CXX_STANDARD 17)
    message(STATUS "Tried to set C++17")
  elseif(ALIZA_CXX_STANDARD STREQUAL "20")
    set(CMAKE_CXX_STANDARD 20)
    message(STATUS "Tried to set C++20")
  elseif(ALIZA_CXX_STANDARD STREQUAL "23")
    set(CMAKE_CXX_STANDARD 23)
    message(STATUS "Tried to set C++23")
  elseif(ALIZA_CXX_STANDARD STREQUAL "26")
    set(CMAKE_CXX_STANDARD 26)
    message(STATUS "Tried to set C++26")
  endif()
  set(CMAKE_CXX_STANDARD_REQUIRED ON)
endif()

if(UNIX AND NOT APPLE)
  if(ALIZA_QT5_6_PLATFORM_XCB)
    add_definitions(-DFORCE_PLATFORM_XCB)
  endif()
endif()

if(ALIZA_DISABLE_SIMDMATH)
  add_definitions(-DDISABLE_SIMDMATH)
else()
  if(${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
    add_definitions(-DDISABLE_SIMDMATH)
  elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64")
    add_definitions(-DDISABLE_SIMDMATH)
  endif()
endif()

if(ALIZA_VERBOSE)
  add_definitions(-DALIZA_VERBOSE)
endif()

if(WIN32)
  if(MDCM_USE_WIN32_UNC)
    add_definitions(-DMDCM_WIN32_UNC)
  endif()
endif()

set(MDCM_LJPEG_LIBRARIES mdcmjpeg8 mdcmjpeg12 mdcmjpeg16)

if(MDCM_USE_SYSTEM_CHARLS)
  find_package(CharLS REQUIRED)
  set(MDCM_CHARLS_LIBRARIES ${CHARLS_LIBRARIES})
  if(CHARLS_LOW)
    add_definitions(-DMDCM_CHARLS_LOW)
  endif()
else()
  set(MDCM_CHARLS_LIBRARIES mdcmcharls)
endif()
add_definitions(-DCHARLS_NO_DEPRECATED_WARNING)

if(MDCM_USE_SYSTEM_OPENJPEG)
  find_package(OpenJPEG 2.0.0 REQUIRED)
  set(MDCM_OPENJPEG_LIBRARIES ${OPENJPEG_LIBRARIES})
else()
  set(MDCM_OPENJPEG_LIBRARIES mdcmopenjp2)
endif()

if(MDCM_USE_SYSTEM_ZLIB)
  find_package(ZLIB REQUIRED)
  include_directories(${ZLIB_INCLUDE_DIR})
  set(MDCM_ZLIB_LIBRARIES ${ZLIB_LIBRARIES})
else()
  set(MDCM_ZLIB_LIBRARIES "mdcmzlib")
endif()

if(UNIX)
  if(MDCM_USE_SYSTEM_UUID)
    find_package(UUID REQUIRED)
    set(MDCM_UUID_LIBRARIES ${UUID_LIBRARIES})
  else()
    set(MDCM_UUID_LIBRARIES "mdcmuuid")
  endif()
endif()

if(MDCM_USE_SYSTEM_OPENSSL)
  find_package(OpenSSL REQUIRED)
  message(STATUS "OpenSSL include: " ${OPENSSL_INCLUDE_DIR})
  message(STATUS "OpenSSL libraries: " ${OPENSSL_LIBRARIES})
endif()

set(MDCM_LIBRARIES
  ${MDCM_LJPEG_LIBRARIES}
  ${MDCM_OPENJPEG_LIBRARIES}
  ${MDCM_CHARLS_LIBRARIES}
  ${MDCM_ZLIB_LIBRARIES})
if(NOT WIN32)
  set(MDCM_LIBRARIES ${MDCM_LIBRARIES} ${MDCM_UUID_LIBRARIES})
endif()
message(STATUS "MDCM: ${MDCM_LIBRARIES}")

include(${CMAKE_ROOT}/Modules/TestBigEndian.cmake)
TEST_BIG_ENDIAN(MDCM_WORDS_BIGENDIAN)

include(${CMAKE_ROOT}/Modules/CheckIncludeFile.cmake)
include(${CMAKE_ROOT}/Modules/CheckIncludeFiles.cmake)

#FIXME
macro(CHECK_INCLUDE_FILE_CONCAT FILE VARIABLE)
  CHECK_INCLUDE_FILES("${UUID_INCLUDES};${FILE}" ${VARIABLE})
  if(${VARIABLE})
    set(UUID_INCLUDES ${UUID_INCLUDES} ${FILE})
  endif()
endmacro()
#

set(MDCM_MAJOR_VERSION 1)
set(MDCM_MINOR_VERSION 6)
set(MDCM_BUILD_VERSION 0)
set(MDCM_VERSION "${MDCM_MAJOR_VERSION}.${MDCM_MINOR_VERSION}.${MDCM_BUILD_VERSION}")
set(MDCM_API_VERSION "${MDCM_MAJOR_VERSION}.${MDCM_MINOR_VERSION}")

check_include_file_concat("byteswap.h" MDCM_HAVE_BYTESWAP_FILE_H)
# s. GDCM bug #324
if(MDCM_HAVE_BYTESWAP_FILE_H)
  include(CheckCXXSourceCompiles)
  check_cxx_source_compiles("#include <byteswap.h>\nint main(){return bswap_32(42);}" MDCM_HAVE_BYTESWAP_H)
endif()
check_include_file("rpc.h" MDCM_HAVE_RPC_H)

include(CheckCXXSourceCompiles)
check_cxx_source_compiles("int main(){const char *f =__FUNCTION__;return 0;}" MDCM_CXX_HAS_FUNCTION)

if(MDCM_USE_SYSTEM_OPENSSL)
  set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})
  set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_LIBRARIES} ${CMAKE_DL_LIBS})
  check_cxx_source_compiles("#include <openssl/cms.h>\nint main(){CMS_add0_recipient_password(0,0,0,0,0,0,0);return 0;}" MDCM_HAVE_CMS_RECIPIENT_PASSWORD)
endif()

include_directories(
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common"
  "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Source/Common"
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary"
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition"
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat"
  "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Utilities"
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities")

if(MDCM_USE_SYSTEM_CHARLS)
  include_directories(${CHARLS_INCLUDE_DIRS})
else()
  include_directories(BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities/mdcmcharls")
endif()

if(MDCM_USE_SYSTEM_OPENJPEG)
  include_directories(${OPENJPEG_INCLUDE_DIRS})
else()
  include_directories(BEFORE
    "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Utilities/mdcmopenjpeg"
    "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Utilities/mdcmopenjpeg/src/lib/openjp2"
    "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities/mdcmopenjpeg/src/lib/openjp2")
endif()

if(NOT MDCM_USE_SYSTEM_ZLIB)
  include_directories(BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities/mdcmzlib")
  include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Utilities/mdcmzlib")
endif()

if(MDCM_USE_SYSTEM_OPENSSL)
  include_directories(${OPENSSL_INCLUDE_DIR})
endif()

if(MDCM_USE_SYSTEM_UUID)
  include_directories(${UUID_INCLUDE_DIR})
  set(MDCMUUID ${UUID_LIBRARIES})
else()
  include_directories(BEFORE "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Utilities/mdcmuuid")
  include_directories(BEFORE "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities/mdcmuuid")
  set(MDCMUUID mdcmuuid)
endif()

configure_file(
  "${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmConfigure.h.in"
  "${CMAKE_CURRENT_BINARY_DIR}/mdcm/Source/Common/mdcmConfigure.h")

#
#
#
#
#
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Utilities)
#
#
#
#
#

set(MDCM_COMMON_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmVersion.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmEvent.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmBase64.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmSHA1.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmCryptoFactory.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmASN1.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmSubject.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmFilename.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmFilenameGenerator.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmSwapCode.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmSystem.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmUnpacker12Bits.cxx)

if(WIN32)
  set(MDCM_COMMON_SRCS ${MDCM_COMMON_SRCS}
    ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmCAPICryptographicMessageSyntax.cxx
    ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmCAPICryptoFactory.cxx)
endif()

if(MDCM_USE_SYSTEM_OPENSSL)
  set(MDCM_COMMON_SRCS ${MDCM_COMMON_SRCS}
    ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmOpenSSLP7CryptographicMessageSyntax.cxx)
endif()

if(MDCM_USE_SYSTEM_OPENSSL AND MDCM_HAVE_CMS_RECIPIENT_PASSWORD)
  set(MDCM_COMMON_SRCS ${MDCM_COMMON_SRCS}
    ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmOpenSSLCryptoFactory.cxx
    ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/Common/mdcmOpenSSLCryptographicMessageSyntax.cxx)
endif()

if(MDCM_USE_SYSTEM_OPENSSL)
  include_directories(${OPENSSL_INCLUDE_DIR})
endif()

set(MDCM_DICT_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmDicts.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmDefaultDicts.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmPrivateDefaultDicts.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmGlobal.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmUIDs.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataDictionary/mdcmCSAHeaderDefaultDicts.cxx)

set(MDCM_DSED_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmByteValue.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmDataSet.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmExplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmFile.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmFileMetaInformation.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmFragment.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmImplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmMediaStorage.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmPrivateTag.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmReader.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmSequenceOfFragments.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmSequenceOfItems.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmValue.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmTag.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmCodeString.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmByteSwapFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmUNExplicitImplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmWriter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmCSAHeader.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmMrProtocol.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmTransferSyntax.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmVM.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmVR.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmPreamble.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmUNExplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmCP246ExplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmExplicitImplicitDataElement.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/DataStructureAndEncodingDefinition/mdcmVR16ExplicitDataElement.cxx)

# Code for segments and surfaces is currently unused.
set(MDCM_MSFF_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmIconImageFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmFileExplicitFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageFragmentSplitter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSimpleSubjectWatcher.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPixmap.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmBitmap.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmRescaler.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageToImageFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmBitmapToBitmapFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPixmapToPixmapFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageChangeTransferSyntax.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageApplyLookupTable.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmApplySupplementalLUT.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmFileDecompressLookupTable.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmOrientation.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmDataSetHelper.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageChangePlanarConfiguration.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmDirectionCosines.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSplitMosaicFilter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmUIDGenerator.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmUUIDGenerator.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmScanner.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPixmapReader.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageReader.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPixmapWriter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageWriter.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageHelper.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImage.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmImageCodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEG12Codec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmRLE.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmRLECodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEG16Codec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEGLSCodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEG8Codec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEGCodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmRAWCodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmEncapsulatedRAWCodec.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmLookupTable.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmOverlay.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmCurve.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPhotometricInterpretation.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmPixelFormat.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSegment.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSurface.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmMeshPrimitive.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSegmentWriter.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSurfaceWriter.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSegmentReader.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSurfaceReader.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSurfaceHelper.cxx
#  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmSegmentHelper.cxx
  ${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEG2000Codec.cxx)

if(NOT MDCM_USE_SYSTEM_OPENJPEG)
  set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEG2000Codec.cxx PROPERTIES COMPILE_DEFINITIONS OPJ_STATIC)
endif()

if(NOT MDCM_USE_SYSTEM_CHARLS)
  set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEGLSCodec.cxx PROPERTIES COMPILE_DEFINITIONS CHARLS_STATIC)
else()
  set_source_files_properties(${CMAKE_CURRENT_SOURCE_DIR}/mdcm/Source/MediaStorageAndFileFormat/mdcmJPEGLSCodec.cxx PROPERTIES COMPILE_DEFINITIONS CHARLS_DLL)
endif()

#
#
#
#
#

if(USE_QT_V_5 OR USE_QT_V_6)
  if(WIN32)
# https://cmake.org/cmake/help/v3.0/policy/CMP0020.html
# Automatically link Qt executables to qtmain target on Windows.
    CMAKE_POLICY(SET CMP0020 NEW)
  endif()
endif()

#
#
#
if(ALIZA_COREGL)
  add_definitions(-DALIZA_GL_3_2_CORE)
endif()

find_package(OpenGL REQUIRED)

if(APPLE)
  add_definitions(-DALIZA_GL_3_2_CORE -DGL_SILENCE_DEPRECATION)
endif()
#
#
#

find_package(ITK COMPONENTS
  ITKCommon
  ITKImageFilterBase
  ITKImageFunction
  ITKImageGrid
  ITKImageIntensity
  ITKSpatialObjects
  ITKStatistics
  ITKTransform)
include(${ITK_USE_FILE})
message(STATUS "ITK: ${ITK_LIBRARIES}")

if(USE_QT_V_6)
  find_package(Qt6 COMPONENTS
    Core
    Gui
    Widgets
    OpenGLWidgets
    PrintSupport
    Svg
    Core5Compat REQUIRED)
  if(NOT ALIZA_MEDIASTORAGE_MODE)
    find_package(Qt6 COMPONENTS Sql REQUIRED)
  endif()
  include_directories(${Qt6Core5Compat_INCLUDE_DIRS})
elseif(USE_QT_V_5)
  find_package(Qt5Core REQUIRED)
  find_package(Qt5Gui REQUIRED)
  find_package(Qt5Widgets REQUIRED)
  find_package(Qt5PrintSupport REQUIRED)
  find_package(Qt5Svg REQUIRED)
  if(NOT ALIZA_MEDIASTORAGE_MODE)
    find_package(Qt5Sql REQUIRED)
  endif()
elseif(USE_QT_V_4)
  find_package(Qt4 REQUIRED)
  set(QT_USE_QTMAIN TRUE)
  set(QT_USE_QTGUI TRUE)
  set(QT_USE_QTOPENGL TRUE)
  set(QT_USE_QTSVG TRUE)
  if(NOT ALIZA_MEDIASTORAGE_MODE)
    set(QT_USE_QTSQL TRUE)
  endif()
  include(${QT_USE_FILE})
  #add_definitions(${QT_DEFINITIONS})
  #message(STATUS "QT_DEFINITIONS: ${QT_DEFINITIONS}")
  if(ALIZA_QT4_SYSTEM_GLEW)
    set(LOCAL_GLEW_PATH "")
  else()
    set(LOCAL_GLEW_PATH "${CMAKE_CURRENT_SOURCE_DIR}/CG/glew")
    add_definitions(-DGLEW_STATIC)
  endif()
  set(USE_QT_V_4 TRUE)
else()
  message(FATAL_ERROR "Can not determine Qt version to use")
endif()

if(NOT ALIZA_MEDIASTORAGE_MODE)
  add_definitions(-DUSE_WORKSTATION_MODE)
endif()

if(WIN32)
  if(MSVC_VERSION EQUAL 1400 OR MSVC_VERSION GREATER 1400)
    add_definitions(
     -D_CRT_SECURE_NO_DEPRECATE
     -D_CRT_NONSTDC_NO_DEPRECATE
     -D_CRT_SECURE_NO_WARNINGS
     -D_SCL_SECURE_NO_DEPRECATE
     -D_SCL_SECURE_NO_WARNINGS)
  endif()
endif()

set(ALIZAMS_SRCS
  ${CMAKE_CURRENT_SOURCE_DIR}/common/mmath.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/common/structures.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp)

if(NOT ALIZA_USE_SYSTEM_BULLET)
  include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/b)
  SET(BULLET_SRCS
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btAlignedAllocator.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btConvexHull.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btConvexHullComputer.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btGeometryUtil.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btPolarDecomposition.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btQuickprof.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btReducedVector.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btSerializer.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btSerializer64.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btThreads.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/btVector3.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/TaskScheduler/btTaskScheduler.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/TaskScheduler/btThreadSupportPosix.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/LinearMath/TaskScheduler/btThreadSupportWin32.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btDbvt.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btDispatcher.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btBox2dBox2dCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCollisionDispatcherMt.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCollisionObject.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCollisionWorld.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCollisionWorldImporter.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btCompoundCompoundCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btConvex2dConvex2dAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btGhostObject.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btHashedSimplePairCache.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btInternalEdgeUtility.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btInternalEdgeUtility.h
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btManifoldResult.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/btUnionFind.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btBoxShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btBox2dShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btCapsuleShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btCollisionShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btCompoundShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConcaveShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConeShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexHullShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexInternalShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexPolyhedron.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvex2dShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btCylinderShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btEmptyShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btMiniSDF.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btMultiSphereShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btOptimizedBvh.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btSdfCollisionShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btShapeHull.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btSphereShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTetrahedronShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleBuffer.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleCallback.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleMesh.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/CollisionShapes/btUniformScalingShape.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/b/BulletCollision/NarrowPhaseCollision/btPolyhedralContactClipping.cpp)
  set(ALIZAMS_SRCS ${ALIZAMS_SRCS} ${BULLET_SRCS})
else()
  include_directories("/usr/include/bullet")
endif()

#
#
#
#
#
if(ALIZA_USE_SYSTEM_LCMS2)
  find_package(LCMS2 REQUIRED)
  add_definitions(-DALIZA_USE_SYSTEM_LCMS2)
  message(STATUS "LCMS2: " ${LCMS2_LIBRARIES})
else()
  add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/alizalcms)
  message(STATUS "LCMS2: alizalcms2")
endif()
#
#
#
#
#

set(ALIZAMS_SRCS ${ALIZAMS_SRCS}
  ${CMAKE_CURRENT_SOURCE_DIR}/common/commonutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/common/contourutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/common/colorspace/colorspace.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/common/codecutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/ultrasoundregionutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/loaddicom_t.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/loaddicom.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/dicomutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/prconfigutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/splituihgridfilter.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/spectroscopyutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/srutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/CG/camera.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/CG/testgl.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/mainwindow.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/updateqtcommand.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/iconutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/histogramgen.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/settingswidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/qxtspanslider.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imagesbox.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/animwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox2D.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/sliderwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/zrangewidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/lutwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/handleitem.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/levelitem.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/rectitem.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicsutils.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicspathitem.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicsview.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studygraphicswidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studygraphicsview.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicswidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/histogramview.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/aboutwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/zoomwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/findrefdialog.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/infodialog.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imageinfodialog.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/srwidget.cpp
  #${CMAKE_CURRENT_SOURCE_DIR}/GUI/tabledialog.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/matrixbutton.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyframewidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyviewwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/sqtree.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/browserwidget2.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/helpwidget.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/anonymazerwidget2.cpp
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/aliza.cpp)

if(NOT ALIZA_MEDIASTORAGE_MODE)
  set(ALIZAMS_SRCS ${ALIZAMS_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/browser/ctkdialog.cpp)
endif()

if(USE_QT_V_4 AND NOT ALIZA_QT4_SYSTEM_GLEW)
  set(ALIZAMS_SRCS ${ALIZAMS_SRCS} "${LOCAL_GLEW_PATH}/src/glew.c")
endif()

if(WIN32)
  set(ALIZAMS_SRCS ${ALIZAMS_SRCS} ${CMAKE_CURRENT_SOURCE_DIR}/alizams.rc)
endif()

set(ALIZAMS_QRCS ${CMAKE_CURRENT_SOURCE_DIR}/alizams.qrc)

set(ALIZAMS_MOC_HRDS
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/mainwindow.h
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/sqtree.h
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/browserwidget2.h
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/helpwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/anonymazerwidget2.h
  ${CMAKE_CURRENT_SOURCE_DIR}/dicom/loaddicom_t.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/findrefdialog.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/infodialog.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imageinfodialog.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/settingswidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/qxtspanslider_p.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/qxtspanslider.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imagesbox.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/animwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox2D.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/sliderwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/zrangewidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/lutwidget.h
  #${CMAKE_CURRENT_SOURCE_DIR}/GUI/tabledialog.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/matrixbutton.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyframewidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyviewwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicsview.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/graphicswidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studygraphicsview.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studygraphicswidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/histogramview.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/zoomwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/aboutwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/srwidget.h
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/aliza.h)

if(APPLE)
  if(USE_QT_V_6)
    set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt5-core.h)
  else()
    message(FATAL_ERROR "Only Qt6 is supported with macOS")
  endif()
else()
  if(USE_QT_V_6)
    if(ALIZA_COREGL)
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt5-core.h)
    else()
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt5.h)
    endif()
  elseif(USE_QT_V_5)
    if(ALIZA_COREGL)
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt5-core.h)
    else()
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt5.h)
    endif()
  elseif(USE_QT_V_4)
    if(ALIZA_COREGL)
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt4-core.h)
    else()
      set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/CG/glwidget-qt4.h)
    endif()
  else()
    message(FATAL_ERROR "Can not determine Qt version to use")
  endif()
endif()

if(NOT ALIZA_MEDIASTORAGE_MODE)
  set(ALIZAMS_MOC_HRDS ${ALIZAMS_MOC_HRDS} ${CMAKE_CURRENT_SOURCE_DIR}/browser/ctkdialog.h)
endif()

set(ALIZAMS_UIS
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/settingswidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/mainwindow.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/aboutwidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/sqtree.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/browserwidget2.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/helpwidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/browser/anonymazerwidget2.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/findrefdialog.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/infodialog.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imagesbox.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/animwidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/toolbox2D.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/sliderwidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/srwidget.ui
  #${CMAKE_CURRENT_SOURCE_DIR}/GUI/tabledialog.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyframewidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/studyviewwidget.ui
  ${CMAKE_CURRENT_SOURCE_DIR}/GUI/imageinfodialog.ui)

if(NOT ALIZA_MEDIASTORAGE_MODE)
  set(ALIZAMS_UIS ${ALIZAMS_UIS} ${CMAKE_CURRENT_SOURCE_DIR}/browser/ctkdialog.ui)
endif()

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}
  "${CMAKE_CURRENT_SOURCE_DIR}/common"
  "${CMAKE_CURRENT_SOURCE_DIR}/GUI"
  "${CMAKE_CURRENT_SOURCE_DIR}/dicom"
  ${CMAKE_CURRENT_BINARY_DIR})

if(CMAKE_SYSTEM_NAME MATCHES "FreeBSD")
  link_directories(/usr/local/lib)
endif()

set(ALIZAMS_SRCS ${ALIZAMS_SRCS} ${MDCM_COMMON_SRCS} ${MDCM_DICT_SRCS} ${MDCM_DSED_SRCS} ${MDCM_MSFF_SRCS})

set(ALIZAMS_LINK_LIBRARIES ${MDCM_LIBRARIES} ${ITK_LIBRARIES})

if(USE_QT_V_6)
  QT6_WRAP_CPP(ALIZAMS_MOC_SRCS ${ALIZAMS_MOC_HRDS})
  QT6_WRAP_UI(ALIZAMS_UI ${ALIZAMS_UIS})
  QT6_ADD_RESOURCES(ALIZAMS_QRCS_RCC ${ALIZAMS_QRCS})
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES}
    Qt6::Core
    Qt6::Gui
    Qt6::Widgets
    Qt6::OpenGLWidgets
    Qt6::PrintSupport
    Qt6::Svg
    Qt6::Core5Compat)
  if(NOT ALIZA_MEDIASTORAGE_MODE)
    set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} Qt6::Sql)
  endif()
elseif(USE_QT_V_5)
  QT5_WRAP_CPP(ALIZAMS_MOC_SRCS ${ALIZAMS_MOC_HRDS})
  QT5_WRAP_UI(ALIZAMS_UI ${ALIZAMS_UIS})
  QT5_ADD_RESOURCES(ALIZAMS_QRCS_RCC ${ALIZAMS_QRCS})
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES}
    Qt5::Core
    Qt5::Gui
    Qt5::Widgets
    Qt5::PrintSupport
    Qt5::Svg)
  if(NOT ALIZA_MEDIASTORAGE_MODE)
    set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} Qt5::Sql)
  endif()
elseif(USE_QT_V_4)
  QT4_WRAP_CPP(ALIZAMS_MOC_SRCS ${ALIZAMS_MOC_HRDS})
  QT4_WRAP_UI(ALIZAMS_UI ${ALIZAMS_UIS})
  QT4_ADD_RESOURCES(ALIZAMS_QRCS_RCC ${ALIZAMS_QRCS})
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} ${QT_LIBRARIES})
else()
  message(FATAL_ERROR "Can not determine Qt version to use")
endif()

if(ALIZA_USE_SYSTEM_BULLET)
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} libLinearMath.so libBulletCollision.so)
endif()

if(ALIZA_USE_SYSTEM_LCMS2)
  include_directories(${LCMS2_INCLUDE_DIRS})
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} ${LCMS2_LIBRARIES})
else()
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} alizalcms2)
endif()

if(MDCM_USE_SYSTEM_OPENSSL)
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} ${OPENSSL_LIBRARIES})
endif()

if(TMP_USE_53_SPATIAL_ENUMS)
  add_definitions(-DTMP_USE_53_SPATIAL_ENUMS)
endif()

link_directories("${CMAKE_CURRENT_BINARY_DIR}/bin")

if(WIN32)
  if(USE_QT_V_4)
    set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} OpenGL::GL)
  endif()
  add_executable(alizams WIN32
    ${ALIZAMS_SRCS}
    ${ALIZAMS_MOC_SRCS}
    ${ALIZAMS_UIS}
    ${ALIZAMS_QRCS_RCC})
  target_link_libraries(alizams ${ALIZAMS_LINK_LIBRARIES} crypt32 rpcrt4)
elseif(APPLE)
  set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES})
  set(ALIZAMS_OSX_ICON_NAME "AlizaMS.icns")
  set(ALIZAMS_OSX_ICON ${CMAKE_CURRENT_SOURCE_DIR}/${ALIZAMS_OSX_ICON_NAME})
  set_source_files_properties(${ALIZAMS_OSX_ICON} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources")
  add_executable(AlizaMS MACOSX_BUNDLE
    ${ALIZAMS_SRCS}
    ${ALIZAMS_MOC_SRCS}
    ${ALIZAMS_UIS}
    ${ALIZAMS_QRCS_RCC}
    ${ALIZAMS_OSX_ICON})
  set_target_properties(AlizaMS PROPERTIES
    MACOSX_BUNDLE_BUNDLE_NAME "AlizaMS"
    MACOSX_BUNDLE_BUNDLE_VERSION ${ALIZAMS_OSX_BUNDLE_VERSION}
    MACOSX_BUNDLE_GUI_IDENTIFIER "com.aliza.alizams"
    MACOSX_BUNDLE_ICON_FILE ${ALIZAMS_OSX_ICON_NAME}
    MACOSX_BUNDLE_COPYRIGHT "© 2015-2024 Aliza Medical Imaging")
  target_link_libraries(AlizaMS ${ALIZAMS_LINK_LIBRARIES})
else()
  if(USE_QT_V_4)
    set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} OpenGL::GL)
    if(ALIZA_QT4_SYSTEM_GLEW)
      set(ALIZAMS_LINK_LIBRARIES ${ALIZAMS_LINK_LIBRARIES} GLEW)
    endif()
  endif()
  add_executable(alizams
    ${ALIZAMS_SRCS}
    ${ALIZAMS_MOC_SRCS}
    ${ALIZAMS_UIS}
    ${ALIZAMS_QRCS_RCC})
  target_link_libraries(alizams ${ALIZAMS_LINK_LIBRARIES})
  install(TARGETS alizams RUNTIME DESTINATION "bin")
  install(DIRECTORY "${CMAKE_SOURCE_DIR}/package/archive/usr/share/icons" DESTINATION "share")
  install(DIRECTORY "${CMAKE_SOURCE_DIR}/package/archive/usr/share/applications" DESTINATION "share")
  install(DIRECTORY "${CMAKE_SOURCE_DIR}/package/archive/usr/share/metainfo" DESTINATION "share")
  install(DIRECTORY "${CMAKE_SOURCE_DIR}/package/archive/usr/share/man" DESTINATION "share")
  install(DIRECTORY "${CMAKE_SOURCE_DIR}/package/archive/usr/share/alizams" DESTINATION "share")
endif()

