Tile swap lays tiles cut from the photographs over the canvas as Tiles does, in a grid, in bricks or scattered, and swaps each one for another cut at a moment of its own, so the mosaic keeps changing piece by piece. The layout stays put for the whole clip; what a tile shows depends only on the tile and how many times it has swapped, counted round the clip, so it holds still between swaps and the clip loops without a jump. On the command line it is -e tileswap with --tileswap-rate and the rest. VideoEffect learns a second kind: an effect that answers needsSources() writes compose() instead of animate(), and the base then takes no crop, only the one seed, so it sees the photographs when it leads the chain and the stage before it otherwise. Transforms render exactly as before. The tile cutting and painting move out of tiles.cpp into tile_plan.hpp for both effects to share; Tiles renders byte for byte as before. Version 0.8.0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
98 lines
3.7 KiB
CMake
98 lines
3.7 KiB
CMake
cmake_minimum_required(VERSION 3.20)
|
|
project(effector VERSION 0.8.0 LANGUAGES CXX)
|
|
|
|
set(CMAKE_CXX_STANDARD 20)
|
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
|
|
endif()
|
|
|
|
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG")
|
|
|
|
find_package(PkgConfig REQUIRED)
|
|
pkg_check_modules(GTKMM REQUIRED IMPORTED_TARGET gtkmm-4.0)
|
|
pkg_check_modules(GDKPIXBUF REQUIRED IMPORTED_TARGET gdk-pixbuf-2.0)
|
|
# Pango and Cairo draw the text effect's glyphs. Neither needs a display, so
|
|
# the core stays headless.
|
|
pkg_check_modules(PANGOCAIRO REQUIRED IMPORTED_TARGET pangocairo)
|
|
|
|
find_package(Threads REQUIRED)
|
|
|
|
# --- version: the one number, and the changelog that goes with it ------------
|
|
# The version is the project() line above; each release is a vX.Y.Z tag on the
|
|
# commit that set it. CHANGELOG.md is baked in so the interface can show it,
|
|
# and editing it re-runs the configure step.
|
|
file(READ ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md EFFECTOR_CHANGELOG)
|
|
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS CHANGELOG.md)
|
|
configure_file(src/core/version.hpp.in ${CMAKE_CURRENT_BINARY_DIR}/generated/core/version.hpp @ONLY)
|
|
|
|
# --- core: effects and image handling, no GUI ---------------------------------
|
|
add_library(effector_core STATIC
|
|
src/core/canvas.cpp
|
|
src/core/chain.cpp
|
|
src/core/effect.cpp
|
|
src/core/image.cpp
|
|
src/core/memory.cpp
|
|
src/core/params.cpp
|
|
src/core/project.cpp
|
|
src/core/registry.cpp
|
|
src/core/rng.cpp
|
|
src/core/style.cpp
|
|
src/core/video.cpp
|
|
src/effects/bitcrush.cpp
|
|
src/effects/blur.cpp
|
|
src/effects/channelsplit.cpp
|
|
src/effects/corrupt.cpp
|
|
src/effects/feedback.cpp
|
|
src/effects/grain.cpp
|
|
src/effects/monochrome.cpp
|
|
src/effects/overlay.cpp
|
|
src/effects/pixelsort.cpp
|
|
src/effects/scanlines.cpp
|
|
src/effects/shatter.cpp
|
|
src/effects/slitshift.cpp
|
|
src/effects/text.cpp
|
|
src/effects/tiles.cpp
|
|
src/effects/tileswap.cpp
|
|
src/effects/tracking.cpp
|
|
src/effects/video_effect.cpp
|
|
src/effects/warp.cpp
|
|
)
|
|
target_include_directories(effector_core PUBLIC src ${CMAKE_CURRENT_BINARY_DIR}/generated)
|
|
# The core is GUI-free: it only needs gdk-pixbuf for decoding and encoding,
|
|
# so headless rendering works without a display.
|
|
target_link_libraries(effector_core PUBLIC PkgConfig::GDKPIXBUF PkgConfig::PANGOCAIRO Threads::Threads)
|
|
target_compile_options(effector_core PRIVATE -Wall -Wextra -Wpedantic)
|
|
|
|
# --- interface: the GTK window, split out so the GUI tests can link it --------
|
|
add_library(effector_gui STATIC
|
|
src/cli/options.cpp
|
|
src/gui/app.cpp
|
|
src/gui/window.cpp
|
|
)
|
|
target_link_libraries(effector_gui PUBLIC effector_core PkgConfig::GTKMM)
|
|
target_compile_options(effector_gui PRIVATE -Wall -Wextra -Wpedantic)
|
|
# Where a build that was never installed finds its own icon (see app.cpp).
|
|
target_compile_definitions(effector_gui PRIVATE
|
|
EFFECTOR_SOURCE_ICON_DIR="${CMAKE_CURRENT_SOURCE_DIR}/data/icons")
|
|
|
|
# --- application --------------------------------------------------------------
|
|
add_executable(effector src/main.cpp)
|
|
target_link_libraries(effector PRIVATE effector_gui)
|
|
target_compile_options(effector PRIVATE -Wall -Wextra -Wpedantic)
|
|
|
|
install(TARGETS effector RUNTIME DESTINATION bin)
|
|
# The launcher entry, so the interface shows up in the desktop's app menu.
|
|
install(FILES data/org.effector.Effector.desktop DESTINATION share/applications)
|
|
# The icon it names, in full colour and as a one-colour symbolic for panels.
|
|
install(DIRECTORY data/icons/hicolor DESTINATION share/icons)
|
|
|
|
# --- tests --------------------------------------------------------------------
|
|
include(CTest)
|
|
if(BUILD_TESTING)
|
|
add_subdirectory(tests)
|
|
endif()
|