- Linux GCC rejects QMetaType instantiation over incomplete types
(static_assert(sizeof(T))); Q_DECLARE_OPAQUE_POINTER every opaque
OakEngine* handle in the public headers so QList<OakEngineTask*> etc
compile
- Windows: gtest discovery ran the fresh exe before the DLLs were next
to it; use DISCOVERY_MODE PRE_TEST on WIN32 and copy the DLLs for
ctest time
The full pure-C facade used by the app: node/project/timeline/viewer/
undo/task/events/serializer/playback/preview/renderer/gizmo/color/
audio/footage/proxy/encoding/exporter/config/disk/ipc/plugin/worker
families, plus undo-group semantics, display renderer handles,
NodeFactory accessors, and per-family pure-C engine tests.
- oakengine_renderer_create/set_mode/last_error, render_frame (sync,
60s timeout, CPU frames via the existing worker pool),
render_audio (planar float), cancel; frames and audio buffers are
owned handles with borrowed data pointers
- output colorspace names map to OCIO display transforms, with
graceful fallback to reference-space output
- oakengine_renderer_test: parameter validation and error paths need
no GL and always run; render assertions gate on
DynamicRenderer backend availability and SKIP cleanly otherwise
- fix a facade bug found by its own test: wait_for_ticket leaked a
connected lambda capturing a stack reference, which a subsequent
cancelled ticket could fire into reused stack memory