Repository navigation
v0.14.0
0.14.0 (2026-10-30)
This release finishes the API review for 1.0. The readers take the context const and read it when host code calls back in (#170). The calls on a clip's player are named for it (#178) and the two counters that were not are named Get...Count (#176). The reduced motion switch returns nothing (#174), the host easing's callback is a function type (#172), and mtwnMakeTrack takes the keyframes it rewrites first (#184). Three getters no longer crash on a null context, and a refused rough easing leaves its points. The getting started guide says what 1.0 will keep. No value, velocity or event record changes.
Changed
-
Breaking: ten readers take a
const mtwnContext*(#170):mtwnClip_GetTrack,mtwnClip_GetNode,mtwnClip_FindLabel,mtwnClip_GetDuration,mtwnTarget_GetValue,mtwnTarget_GetState,mtwnPlayer_GetState(nowmtwnClipPlayer_GetState),mtwnContext_ReadTargets,mtwnContext_GetClipBytesandmtwnContext_MeasureTransition. C callers compile as before; a C++ pointer to one of them has a new type.- Called back in from the host's code the context runs (a host easing, the allocator, the task system's functions), all but
mtwnTarget_GetStatenow read the context as the call in progress has left it, where they returnedmtwn_errorBusy, and count no misuse. mtwnTarget_GetStateis still refused when called back in: a target's velocity may be computed when read, by sampling a host easing, which could otherwise call it again without end.- While an update's clip players run in groups on the host's task system,
mtwnTarget_GetValue,mtwnContext_ReadTargets,mtwnClipPlayer_GetStateandmtwnContext_MeasureTransitioncalled from the host's code are refused withmtwn_errorBusy, one misuse counted, their outputs left as they were, since a group may be writing what they read. mtwnDestroyClipandmtwnDestroyContextrelease a clip's id before the host's free gets its block, so a free that reads back the clip finds the id stale.
- Called back in from the host's code the context runs (a host easing, the allocator, the task system's functions), all but
-
Breaking: the calls that take only a clip's player are named for it (#178):
Before Now mtwnPlayer_Play,_Pause,_Reverse,_Finish,_CancelmtwnClipPlayer_Play,_Pause,_Reverse,_Finish,_CancelmtwnPlayer_Seek,_Sweep,_SeekProgress,_SeekLabelmtwnClipPlayer_Seek,_Sweep,_SeekProgress,_SeekLabelmtwnPlayer_SetRate,_SetWeight,_GetStatemtwnClipPlayer_SetRate,_SetWeight,_GetStatemtwnCreatePlayermtwnCreateClipPlayermtwnPlayerDefmtwnClipPlayerDefmtwnDefaultPlayerDefmtwnDefaultClipPlayerDefMTWN_PLAYER_DEF_COOKIEMTWN_CLIP_PLAYER_DEF_COOKIEmtwnPlayerStatemtwnClipPlayerStatemtwnPlayerId,mtwnDestroyPlayerandmtwnPlayer_IsValid, which take a transition's player too, andmtwnPlayStatekeep their names. Parameters, values and the cookie's value are unchanged. -
Breaking:
mtwnContext_GetDroppedEventsismtwnContext_GetDroppedEventCountandmtwnContext_GetSerialAdvancesismtwnContext_GetSerialAdvanceCount, as the family names its counters. Their parameters and behavior are unchanged (#176). -
Breaking:
mtwnContext_EnableReducedMotionreturnsvoid. A null context changes nothing, and a call back in changes nothing and counts one misuse, as their refusals did; read the state withmtwnContext_IsReducedMotionEnabled(#174). -
Breaking:
mtwnEaseFunctionis a function type,double (void* context, double progress), as the task hooks' are:mtwnMakeHostEasingtakes, andmtwnEasing.functionholds, amtwnEaseFunction*. Passing a function's name compiles as before; a variable of the old type is declaredmtwnEaseFunction*(#172). -
Breaking:
mtwnMakeTracktakes the keyframes and their count first and the def third:mtwnMakeTrack(keyframes, count, def, lengthsOut, mixesOut, trackOut). It rewrites the keyframes in place for angles and for rotations on the shortest path, so they are the call's object, as the family's conventions order it. A call in the old order no longer compiles (#184). -
docs/user/getting-started.mdhas a Compatibility section, linked from the README: what 1.0.0 will keep across 1.y (every function, type, enum value, macro and struct field in the headers, things only added), what it leaves out (the fields of the made value structs a host never reads), the binary interface within a minor version, and results the same bits on every platform, any change of a bit stated here. The transitions guide says to askmtwnPlayer_IsValidbefore stopping a transition that may have ended (#180).
Fixed
mtwnContext_GetMisuse,mtwnContext_GetSerialAdvanceCountandmtwnContext_GetMemoryBytesread 0 from a null context, where they crashed, as the other getters do (#165).- A refused
mtwnMakeRoughEasingleaves the caller's points as they were. A host shape giving a value that is not finite past the first inner points left part of a new set there; the shape is now sampled at every inner point before one is written (#168). mtwnFitLinearEasingsays what a refused fit leaves in its points, which its header called unspecified: the fit's first points, at most the capacity, exactly as a larger buffer would start, and the rest as they were (#182).