project(gwenviewlib)

add_definitions(-DTRANSLATION_DOMAIN="gwenview")

set(LIBGWENVIEW_VERSION "4.97.0")

if (${JPEG_VERSION} LESS 80)
    set(GV_JPEG_DIR libjpeg-62)
endif()

if (${JPEG_VERSION} EQUAL 80)
    set(GV_JPEG_DIR libjpeg-80)
endif()

if (${JPEG_VERSION} EQUAL 90)
    set(GV_JPEG_DIR libjpeg-90)
endif()

if ("${GV_JPEG_DIR}" STREQUAL "")
    message(FATAL_ERROR "Unknown libjpeg version: ${jpeglib_version}")
endif()

message(STATUS "libjpeg version: ${JPEG_VERSION}")

add_definitions(-Dlibjpeg_EXPORTS)
include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/${GV_JPEG_DIR}
    ${CMAKE_CURRENT_SOURCE_DIR}/..
    ${CMAKE_CURRENT_BINARY_DIR}
    )

if(HAVE_FITS)
    include_directories(
        ${CFITSIO_INCLUDE_DIR}
        )
endif()

# For config-gwenview.h
include_directories(
    ${CMAKE_CURRENT_BINARY_DIR}/..
    )

set(gwenviewlib_SRCS
    bcg/bcgimageoperation.cpp
    bcg/bcgtool.cpp
    bcg/bcgwidget.cpp
    bcg/imageutils.cpp
    cms/iccjpeg.c
    cms/cmsprofile.cpp
    cms/cmsprofile_png.cpp
    contextmanager.cpp
    crop/cropwidget.cpp
    crop/cropimageoperation.cpp
    crop/croptool.cpp
    document/abstractdocumentimpl.cpp
    document/documentjob.cpp
    document/animateddocumentloadedimpl.cpp
    document/document.cpp
    document/documentfactory.cpp
    document/documentloadedimpl.cpp
    document/emptydocumentimpl.cpp
    document/jpegdocumentloadedimpl.cpp
    document/loadingdocumentimpl.cpp
    document/loadingjob.cpp
    document/savejob.cpp
    document/svgdocumentloadedimpl.cpp
    document/videodocumentloadedimpl.cpp
    documentview/abstractdocumentviewadapter.cpp
    documentview/abstractimageview.cpp
    documentview/abstractrasterimageviewtool.cpp
    documentview/alphabackgrounditem.cpp
    documentview/birdeyeview.cpp
    documentview/documentview.cpp
    documentview/documentviewcontroller.cpp
    documentview/documentviewsynchronizer.cpp
    documentview/loadingindicator.cpp
    documentview/messageviewadapter.cpp
    documentview/rasterimageview.cpp
    documentview/rasterimageviewadapter.cpp
    documentview/rasterimageitem.cpp
    documentview/svgviewadapter.cpp
    documentview/videoviewadapter.cpp
    about.cpp
    abstractimageoperation.cpp
    disabledactionshortcutmonitor.cpp
    documentonlyproxymodel.cpp
    documentview/documentviewcontainer.cpp
    binder.cpp
    eventwatcher.cpp
    historymodel.cpp
    recentfilesmodel.cpp
    archiveutils.cpp
    datewidget.cpp
    decoratedtag/decoratedtag.cpp
    exiv2imageloader.cpp
    flowlayout.cpp
    fullscreenbar.cpp
    hud/hudbutton.cpp
    hud/hudbuttonbox.cpp
    hud/hudcountdown.cpp
    hud/hudlabel.cpp
    hud/hudmessagebubble.cpp
    hud/hudslider.cpp
    hud/hudtheme.cpp
    hud/hudwidget.cpp
    graphicswidgetfloater.cpp
    imagemetainfomodel.cpp
    imageutils.cpp
    invisiblebuttongroup.cpp
    iodevicejpegsourcemanager.cpp
    jpegcontent.cpp
    kindproxymodel.cpp
    semanticinfo/sorteddirmodel.cpp
    memoryutils.cpp
    mimetypeutils.cpp
    paintutils.cpp
    placetreemodel.cpp
    preferredimagemetainfomodel.cpp
    print/printhelper.cpp
    print/printoptionspage.cpp
    recursivedirmodel.cpp
    shadowfilter.cpp
    slidecontainer.cpp
    slideshow.cpp
    statusbartoolbutton.cpp
    stylesheetutils.cpp
    redeyereduction/redeyereductionimageoperation.cpp
    redeyereduction/redeyereductiontool.cpp
    resize/resizeimageoperation.cpp
    resize/resizeimagedialog.cpp
    thumbnailprovider/thumbnailgenerator.cpp
    thumbnailprovider/thumbnailprovider.cpp
    thumbnailprovider/thumbnailwriter.cpp
    thumbnailview/abstractthumbnailviewhelper.cpp
    thumbnailview/abstractdocumentinfoprovider.cpp
    thumbnailview/dragpixmapgenerator.cpp
    thumbnailview/itemeditor.cpp
    thumbnailview/previewitemdelegate.cpp
    thumbnailview/thumbnailbarview.cpp
    thumbnailview/thumbnailslider.cpp
    thumbnailview/thumbnailview.cpp
    thumbnailview/tooltipwidget.cpp
    timeutils.cpp
    transformimageoperation.cpp
    urlutils.cpp
    widgetfloater.cpp
    zoomcombobox/zoomcombobox.cpp
    zoomslider.cpp
    zoomwidget.cpp
    scrollerutils.cpp
    touch/touch.cpp
    touch/tapholdandmoving.cpp
    touch/twofingerpan.cpp
    touch/oneandtwofingerswipe.cpp
    touch/doubletap.cpp
    touch/twofingertap.cpp
    touch/touch_helper.cpp
    ${GV_JPEG_DIR}/transupp.c
    )
if (kImageAnnotator-Qt6_FOUND)
    set(gwenviewlib_SRCS ${gwenviewlib_SRCS}
        annotate/annotatedialog.cpp
        annotate/annotateoperation.cpp
        annotate/annotatedialog.h
        annotate/annotateoperation.h
    )
endif()

if (NOT GWENVIEW_NO_WAYLAND_GESTURES)
    set(gwenviewlib_SRCS ${gwenviewlib_SRCS}
        waylandgestures/waylandgestures.cpp
        waylandgestures/waylandgestures.h
    )
endif()

set_source_files_properties(${GV_JPEG_DIR}/transupp.c PROPERTIES SKIP_UNITY_BUILD_INCLUSION ON)


ecm_qt_declare_logging_category(gwenviewlib_SRCS HEADER gwenview_lib_debug.h IDENTIFIER GWENVIEW_LIB_LOG CATEGORY_NAME org.kde.kdegraphics.gwenview.lib)
ecm_qt_declare_logging_category(gwenviewlib_SRCS HEADER gwenview_exiv2_debug.h IDENTIFIER GWENVIEW_EXIV2_LOG CATEGORY_NAME org.kde.kdegraphics.gwenview.exiv2 DEFAULT_SEVERITY Critical DESCRIPTION "gwenview lib exiv2 (kdegraphics)" EXPORT GWENVIEW)

if(HAVE_QTDBUS)
    set(gwenviewlib_SRCS
        ${gwenviewlib_SRCS}
        mpris2/lockscreenwatcher.cpp
        mpris2/dbusabstractadaptor.cpp
        mpris2/mpris2service.cpp
        mpris2/mprismediaplayer2.cpp
        mpris2/mprismediaplayer2player.cpp
        mpris2/lockscreenwatcher.h
        mpris2/dbusabstractadaptor.h
        mpris2/mpris2service.h
        mpris2/mprismediaplayer2.h
        mpris2/mprismediaplayer2player.h
        )
    qt_add_dbus_interface(gwenviewlib_SRCS mpris2/org.freedesktop.ScreenSaver.xml screensaverdbusinterface)
endif()

if(HAVE_FITS)
    set(gwenviewlib_SRCS
        ${gwenviewlib_SRCS}
        imageformats/fitsplugin.cpp
        imageformats/fitshandler.cpp
        imageformats/fitsformat/bayer.c
        imageformats/fitsformat/fitsdata.cpp
        imageformats/fitsplugin.h
        imageformats/fitshandler.h
        imageformats/fitsformat/bayer.h
        imageformats/fitsformat/fitsdata.h
        )
endif()

if (NOT GWENVIEW_SEMANTICINFO_BACKEND_NONE)
    set(gwenviewlib_SRCS
        ${gwenviewlib_SRCS}
        semanticinfo/abstractsemanticinfobackend.cpp
        semanticinfo/semanticinfodirmodel.cpp
        semanticinfo/tagitemdelegate.cpp
        semanticinfo/tagmodel.cpp
        semanticinfo/tagwidget.cpp
        semanticinfo/abstractsemanticinfobackend.h
        semanticinfo/semanticinfodirmodel.h
        semanticinfo/tagitemdelegate.h
        semanticinfo/tagmodel.h
        semanticinfo/tagwidget.h
        )
endif()

if (GWENVIEW_SEMANTICINFO_BACKEND_FAKE)
    set(gwenviewlib_SRCS
        ${gwenviewlib_SRCS}
        semanticinfo/fakesemanticinfobackend.cpp
        semanticinfo/fakesemanticinfobackend.h
        )
endif()

if (GWENVIEW_SEMANTICINFO_BACKEND_BALOO)
    set(gwenviewlib_SRCS
        ${gwenviewlib_SRCS}
        semanticinfo/baloosemanticinfobackend.cpp
        semanticinfo/baloosemanticinfobackend.h
        )
endif()

kde_source_files_enable_exceptions(
    exiv2imageloader.cpp
    imagemetainfomodel.cpp
    timeutils.cpp
    cms/cmsprofile.cpp
    document/abstractdocumentimpl.cpp
    document/document.cpp
    document/loadingdocumentimpl.cpp
    jpegcontent.cpp
    exiv2imageloader.h
    imagemetainfomodel.h
    timeutils.h
    cms/cmsprofile.h
    document/abstractdocumentimpl.h
    document/document.h
    document/loadingdocumentimpl.h
    jpegcontent.h
    )

ki18n_wrap_ui(gwenviewlib_SRCS
    documentview/messageview.ui
    print/printoptionspage.ui
    redeyereduction/redeyereductionwidget.ui
    resize/resizeimagewidget.ui
    )

kconfig_add_kcfg_files(gwenviewlib_SRCS
    gwenviewconfig.kcfgc
    )

add_library(gwenviewlib SHARED ${gwenviewlib_SRCS})
generate_export_header(gwenviewlib BASE_NAME gwenviewlib)
set_target_properties(gwenviewlib PROPERTIES VERSION ${LIBGWENVIEW_VERSION} SOVERSION 5)
if (WIN32)
    set_target_properties(gwenviewlib PROPERTIES COMPILE_FLAGS -DJPEG_STATIC)
endif()

target_link_libraries(gwenviewlib
   Qt::Concurrent
   Qt::Svg
   Qt::PrintSupport
   KF6::GuiAddons
   KF6::ConfigGui
   KF6::KIOCore
   KF6::KIOWidgets
   KF6::KIOFileWidgets
   KF6::I18n
   KF6::WindowSystem
   KF6::IconThemes
   KF6::XmlGui
   LibExiv2::LibExiv2
   JPEG::JPEG
   PNG::PNG
    ${LCMS2_LIBRARIES}
    Phonon::phonon4qt6
    )
if (QT_MAJOR_VERSION STREQUAL "6")
    target_link_libraries(gwenviewlib Qt6::OpenGLWidgets KF6::IconWidgets)
endif()


if(HAVE_QTDBUS)
    target_link_libraries(gwenviewlib Qt::DBus)
endif()
if(HAVE_FITS)
    target_link_libraries(gwenviewlib ${CFITSIO_LIBRARIES})
endif()

if (WIN32)
    target_link_libraries(gwenviewlib ${EXPAT_LIBRARIES})
endif()

if (KF5KDcraw_FOUND)
    target_link_libraries(gwenviewlib KF5::KDcraw)
elseif(KDcrawQt6_FOUND)
    target_link_libraries(gwenviewlib KDcrawQt6)
endif()

if (HAVE_X11)
    target_link_libraries(gwenviewlib X11::X11)
    if (QT_MAJOR_VERSION STREQUAL "5")
        target_link_libraries(gwenviewlib Qt5::X11Extras)
    else()
        target_link_libraries(gwenviewlib Qt6::GuiPrivate) # Gui/private/qtx11extras_p.h
    endif()
endif()

if (QT_MAJOR_VERSION STREQUAL "6")
    target_link_libraries(gwenviewlib Qt6::SvgWidgets)
endif()

if (GWENVIEW_SEMANTICINFO_BACKEND_BALOO)
    target_link_libraries(gwenviewlib
        KF6::Baloo
        KF6::FileMetaData
        )
endif()

if(kImageAnnotator-Qt6_FOUND)
    target_link_libraries(gwenviewlib kImageAnnotator::kImageAnnotator)
endif()

if (NOT GWENVIEW_NO_WAYLAND_GESTURES)
    if (QT_MAJOR_VERSION EQUAL "5")
        ecm_add_qtwayland_client_protocol(wayland_SRCS
            PROTOCOL ${WaylandProtocols_DATADIR}/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml
            BASENAME pointer-gestures-unstable-v1
        )
    else()
        qt6_generate_wayland_protocol_client_sources(gwenviewlib FILES
            ${WaylandProtocols_DATADIR}/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml)
    endif()

    target_sources(gwenviewlib PRIVATE ${wayland_SRCS})
    target_link_libraries(gwenviewlib Wayland::Client Qt::WaylandClient Qt::GuiPrivate)
    target_sources(gwenviewlib PRIVATE waylandgestures/waylandgestures.cpp waylandgestures/waylandgestures.h)
endif()

install(TARGETS gwenviewlib ${KDE_INSTALL_TARGETS_DEFAULT_ARGS} LIBRARY NAMELINK_SKIP)