cmake_minimum_required(VERSION 3.18)
project(cr3)

option(POCKETBOOK_FW6 "Build for modern PocketBook firmware and SDK" OFF)
if(POCKETBOOK_FW6)
  ADD_DEFINITIONS(-DPOCKETBOOK_FW6=1)
endif()

if( ${CMAKE_SYSTEM} MATCHES "Darwin" )
  message("MAC OSX build")
  SET(MAC 1)
endif( ${CMAKE_SYSTEM} MATCHES "Darwin" )

IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE Release CACHE STRING
      "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel."
      FORCE)
ENDIF(NOT CMAKE_BUILD_TYPE)

IF(${CMAKE_BUILD_TYPE} STREQUAL Debug)
  ADD_DEFINITIONS( -D_DEBUG=1 -DDEBUG=1 )
ELSE()
  ADD_DEFINITIONS( -DNDEBUG=1 )
ENDIF(${CMAKE_BUILD_TYPE} STREQUAL Debug)

if(MSVC)
  # Force to always compile with W4
  if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]")
    string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
  else()
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4")
  endif()
elseif(CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX)
  # Update if necessary
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long")
  # set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic")

  if(POCKETBOOK_PRO_FW5)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-strict-overflow")
  endif()
endif()

# The maintained frontend is PocketBook; historical desktop ports are upstream.
set(GUI CRGUI_PB CACHE STRING "Frontend: CRGUI_PB")
set_property(CACHE GUI PROPERTY STRINGS CRGUI_PB)
if(NOT GUI STREQUAL "CRGUI_PB")
  message(FATAL_ERROR "Unsupported GUI ${GUI}; this fork builds CRGUI_PB")
endif()

# Determines whether to use external app EDICT for dictionary
if (NOT DEFINED USE_EXTERNAL_EDICT_DICTIONARY)
  SET(USE_EXTERNAL_EDICT_DICTIONARY 0)
else()
  SET(USE_EXTERNAL_EDICT_DICTIONARY ${USE_EXTERNAL_EDICT_DICTIONARY})
endif (NOT DEFINED USE_EXTERNAL_EDICT_DICTIONARY)
message("using USE_EXTERNAL_EDICT_DICTIONARY=${USE_EXTERNAL_EDICT_DICTIONARY}")
ADD_DEFINITIONS( -DUSE_EXTERNAL_EDICT_DICTIONARY=${USE_EXTERNAL_EDICT_DICTIONARY} )


# Document buffer cache / compression settings

#whether to compress data
if (NOT DEFINED DOC_DATA_COMPRESSION_LEVEL)
  message("-D DOC_DATA_COMPRESSION_LEVEL=0|1|2|3|4|5 parameter is not defined: will use default value")
  SET(DOC_DATA_COMPRESSION_LEVEL 1)
else()
  SET(DOC_DATA_COMPRESSION_LEVEL ${DOC_DATA_COMPRESSION_LEVEL})
endif (NOT DEFINED DOC_DATA_COMPRESSION_LEVEL)
message("using TEXT_COMPRESSION_LEVEL=${DOC_DATA_COMPRESSION_LEVEL}")
ADD_DEFINITIONS( -DDOC_DATA_COMPRESSION_LEVEL=${DOC_DATA_COMPRESSION_LEVEL} )

# Total RAM buffers size for document
if (NOT DEFINED DOC_BUFFER_SIZE)
  message("-D DOC_BUFFER_SIZE=N parameter is not defined: will use default value")
  SET(DOC_BUFFER_SIZE 0x400000)
else()
  SET(DOC_BUFFER_SIZE ${DOC_BUFFER_SIZE})
endif (NOT DEFINED DOC_BUFFER_SIZE)
message("using DOC_BUFFER_SIZE=${DOC_BUFFER_SIZE}")
ADD_DEFINITIONS( -DDOC_BUFFER_SIZE=${DOC_BUFFER_SIZE} )

# big page margins support
if (NOT DEFINED BIG_PAGE_MARGINS)
  SET(BIG_PAGE_MARGINS 0)
else()
  SET(BIG_PAGE_MARGINS ${BIG_PAGE_MARGINS})
endif (NOT DEFINED BIG_PAGE_MARGINS)
ADD_DEFINITIONS( -DBIG_PAGE_MARGINS=${BIG_PAGE_MARGINS} )

# big page margins support
if (NOT DEFINED MAX_IMAGE_SCALE_MUL)
  SET(MAX_IMAGE_SCALE_MUL 0)
else()
  SET(MAX_IMAGE_SCALE_MUL ${MAX_IMAGE_SCALE_MUL})
endif (NOT DEFINED MAX_IMAGE_SCALE_MUL)
ADD_DEFINITIONS( -DMAX_IMAGE_SCALE_MUL=${MAX_IMAGE_SCALE_MUL} )
message("using MAX_IMAGE_SCALE_MUL=${MAX_IMAGE_SCALE_MUL}")


if(MAC)
  ADD_DEFINITIONS( -DMAC=1 -DLINUX=1 -D_LINUX=1 -DCR_EMULATE_GETTEXT=1 )
elseif ( WIN32 )
  ADD_DEFINITIONS( -DWIN32=1 -D_WIN32=1 -DCR_EMULATE_GETTEXT=1 -DNOMINMAX=1 -D_CRT_SECURE_NO_WARNINGS )
else()
  ADD_DEFINITIONS( -DLINUX=1 -D_LINUX=1 )
endif(MAC)

if (NOT DEFINED GRAY_BACKBUFFER_BITS)
  SET(GRAY_BACKBUFFER_BITS 2)
endif (NOT DEFINED GRAY_BACKBUFFER_BITS)
if (NOT DEFINED ENABLE_DBUS_VIEWER_EVENTS)
  SET(ENABLE_DBUS_VIEWER_EVENTS 0)
endif (NOT DEFINED ENABLE_DBUS_VIEWER_EVENTS)


SET (CRGUI_DEFS -DCOLOR_BACKBUFFER=0 -DLDOM_USE_OWN_MEM_MAN=0 -DGRAY_BACKBUFFER_BITS=${GRAY_BACKBUFFER_BITS}
      -DENABLE_DBUS_VIEWER_EVENTS=${ENABLE_DBUS_VIEWER_EVENTS})

include(tools/dependencies.cmake)

message("Will build patched LIBCHM library\n")
ADD_SUBDIRECTORY(thirdparty/chmlib)
SET(CHM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/chmlib/src)
SET(CHM_LIBRARIES chmlib)
ADD_DEFINITIONS(-DCHM_SUPPORT_ENABLED=1)

message("Will build patched ANTIWORD library\n")
ADD_DEFINITIONS(-DCR3_ANTIWORD_PATCH=1)
ADD_SUBDIRECTORY(thirdparty/antiword)
SET(ANTIWORD_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/antiword)
SET(ANTIWORD_LIBRARIES antiword)
ADD_DEFINITIONS(-DENABLE_ANTIWORD=1)
INCLUDE_DIRECTORIES( ${ANTIWORD_INCLUDE_DIR} )

INCLUDE_DIRECTORIES(
  ${PNG_INCLUDE_DIR}
  ${JPEG_INCLUDE_DIR}
  ${ZLIB_INCLUDE_DIRS}
  ${FREETYPE_INCLUDE_DIRS}
  ${ANTIWORD_INCLUDE_DIR}
  ${CHM_INCLUDE_DIR}
  ${CURL_INCLUDE_DIRS}
)

if( DEFINED POCKETBOOK_PRO )
  SET(STD_LIBS
    ${JPEG_LIBRARIES}
    ${FREETYPE_LIBRARIES}
    ${PNG_LIBRARIES}
    ${ZLIB_LIBRARIES}
    ${CHM_LIBRARIES}
    ${ZLIB_LIBRARIES}
    ${ANTIWORD_LIBRARIES}
    ${CURL_LIBRARIES}
    inkview
    dl
  )
else()
  SET(STD_LIBS
    ${JPEG_LIBRARIES}
    ${FREETYPE_LIBRARIES}
    ${PNG_LIBRARIES}
    ${ZLIB_LIBRARIES}
    ${CHM_LIBRARIES}
    ${ZLIB_LIBRARIES}
    ${ANTIWORD_LIBRARIES}
  )
endif( DEFINED POCKETBOOK_PRO )
list(APPEND STD_LIBS qimagescale)
include_directories(${FT_INCLUDE_PATH})


include_directories(crengine/include)

include_directories(tinydict)
message("Will make tinydict library - .dict format support")
ADD_SUBDIRECTORY(tinydict)

message("Will make CR3GUI for PocketBook")
ADD_DEFINITIONS(-DLBOOK=1 -DCR_POCKETBOOK=1 ${CRGUI_DEFS}
  -DCR_USE_INVERT_FOR_SELECTION_MARKS=1 -DENABLE_UPDATE_MODE_SETTING=1)
ADD_DEFINITIONS(-DCR_INTERNAL_PAGE_ORIENTATION=0)
ADD_SUBDIRECTORY(crengine)
ADD_SUBDIRECTORY(cr3gui)
FIND_PATH(INKVIEW_INCLUDE_DIR inkview.h)
IF(INKVIEW_INCLUDE_DIR)
  include_directories(${INKVIEW_INCLUDE_DIR})
ELSE()
  message(FATAL_ERROR "inkview.h not found; use the PocketBook SDK toolchain")
ENDIF()
