diff options
author | Sybren A. Stüvel <sybren@blender.org> | 2020-11-10 15:44:47 +0300 |
---|---|---|
committer | Sybren A. Stüvel <sybren@blender.org> | 2020-11-10 15:44:47 +0300 |
commit | 4960780d76bf5a157404cfa5b126cd8ab87caec8 (patch) | |
tree | 0e9c7f2e68baa2af13ca155fbcc27d3a715d6b1f /source/blender/blenkernel/intern/fcurve.c | |
parent | 05a2382c08402b250d6b5c4105b449f4474f6cf2 (diff) |
Animation: More explicit boundary checks when setting active keyframe
Fix unit test failing in debug mode by having more explicit boundary checks
when setting an FCurve's active keyframe.
No functional changes.
Diffstat (limited to 'source/blender/blenkernel/intern/fcurve.c')
-rw-r--r-- | source/blender/blenkernel/intern/fcurve.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/fcurve.c b/source/blender/blenkernel/intern/fcurve.c index dcf4c78dfd8..003e926e0ae 100644 --- a/source/blender/blenkernel/intern/fcurve.c +++ b/source/blender/blenkernel/intern/fcurve.c @@ -841,11 +841,23 @@ bool BKE_fcurve_calc_range( */ void BKE_fcurve_active_keyframe_set(FCurve *fcu, const BezTriple *active_bezt) { + if (active_bezt == NULL) { + fcu->active_keyframe_index = FCURVE_ACTIVE_KEYFRAME_NONE; + return; + } + + /* Gracefully handle out-of-bounds pointers. Ideally this would do a BLI_assert() as well, but + * then the unit tests would break in debug mode. */ + ptrdiff_t offset = active_bezt - fcu->bezt; + if (offset < 0 || offset >= fcu->totvert) { + fcu->active_keyframe_index = FCURVE_ACTIVE_KEYFRAME_NONE; + return; + } + /* The active keyframe should always be selected. */ - BLI_assert((active_bezt == NULL) || - ((active_bezt->f1 | active_bezt->f2 | active_bezt->f3) & SELECT)); - fcu->active_keyframe_index = (active_bezt == NULL) ? FCURVE_ACTIVE_KEYFRAME_NONE : - active_bezt - fcu->bezt; + BLI_assert(BEZT_ISSEL_ANY(active_bezt)); + + fcu->active_keyframe_index = (int)offset; } /** |