Skip to content

Commit

Permalink
Merge branch 'main' into fix/play-after-set_frame
Browse files Browse the repository at this point in the history
  • Loading branch information
theashraf authored Apr 15, 2024
2 parents a86c855 + 8d9f320 commit 00e2239
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 83 deletions.
1 change: 0 additions & 1 deletion dotlottie-rs/benches/benchmarks.rs
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ fn animation_loop_benchmark(c: &mut Criterion) {
let player = DotLottiePlayer::new(Config {
autoplay: true,
loop_animation: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down
32 changes: 24 additions & 8 deletions dotlottie-rs/src/dotlottie_player.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ impl Default for Config {
}
}

const FRAME_DIFF_THRESHOLD: f32 = 0.001;

struct DotLottieRuntime {
renderer: LottieRenderer,
playback_state: PlaybackState,
Expand Down Expand Up @@ -274,21 +276,35 @@ impl DotLottieRuntime {
let raw_next_frame = (elapsed_time / effective_duration) * effective_total_frames;

// update the next frame based on the direction
let next_frame = match self.direction {
let mut next_frame = match self.direction {
Direction::Forward => start_frame + raw_next_frame,
Direction::Reverse => end_frame - raw_next_frame,
};

let next_frame = if self.config.use_frame_interpolation {
next_frame
} else {
next_frame.round()
if !self.config.use_frame_interpolation {
next_frame = next_frame.round();
}

/*
Note:
If we're close to the end frame, we should snap to it as tvg_set_frame ignore the frame which is 0.001 less than the current frame.
*/
match self.direction {
Direction::Forward => {
if (next_frame - end_frame).abs() < FRAME_DIFF_THRESHOLD {
next_frame = end_frame;
}
}
Direction::Reverse => {
if (next_frame - start_frame).abs() < FRAME_DIFF_THRESHOLD {
next_frame = start_frame
}
}
};

// to ensure the next_frame won't go beyond the start & end frames
let next_frame = next_frame.clamp(start_frame, end_frame);
next_frame = next_frame.clamp(start_frame, end_frame);

let next_frame = match self.config.mode {
next_frame = match self.config.mode {
Mode::Forward => self.handle_forward_mode(next_frame, end_frame),
Mode::Reverse => self.handle_reverse_mode(next_frame, start_frame),
Mode::Bounce => self.handle_bounce_mode(next_frame, start_frame, end_frame),
Expand Down
1 change: 0 additions & 1 deletion dotlottie-rs/tests/autoplay.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ mod tests {
fn test_autoplay() {
let player = DotLottiePlayer::new(Config {
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down
12 changes: 5 additions & 7 deletions dotlottie-rs/tests/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -70,13 +70,11 @@ mod tests {

#[test]
fn test_subscribe_unsubscribe() {
let player =
DotLottiePlayer::new(Config {
autoplay: true,
loop_animation: true,
use_frame_interpolation: false,
..Config::default()
});
let player = DotLottiePlayer::new(Config {
autoplay: true,
loop_animation: true,
..Config::default()
});

let events = Arc::new(Mutex::new(vec![]));
let observer_events = Arc::clone(&events);
Expand Down
2 changes: 0 additions & 2 deletions dotlottie-rs/tests/markers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ mod tests {
fn test_markers() {
let player = DotLottiePlayer::new(Config {
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down Expand Up @@ -82,7 +81,6 @@ mod tests {
fn test_set_marker() {
let player = DotLottiePlayer::new(Config {
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down
4 changes: 0 additions & 4 deletions dotlottie-rs/tests/play_mode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -84,7 +84,6 @@ mod play_mode_tests {
let player = DotLottiePlayer::new(Config {
mode: Mode::Forward,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down Expand Up @@ -133,7 +132,6 @@ mod play_mode_tests {
let player = DotLottiePlayer::new(Config {
mode: Mode::Reverse,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down Expand Up @@ -180,7 +178,6 @@ mod play_mode_tests {
let player = DotLottiePlayer::new(Config {
mode: Mode::Bounce,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down Expand Up @@ -247,7 +244,6 @@ mod play_mode_tests {
let player = DotLottiePlayer::new(Config {
mode: Mode::ReverseBounce,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
});

Expand Down
98 changes: 46 additions & 52 deletions dotlottie-rs/tests/speed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,58 +28,52 @@ mod tests {

#[test]
fn test_playback_speed_accuracy() {
let configs: Vec<(Config, f32)> =
vec![
// test with default config
(
Config {
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
1.0,
),
// test with different speeds
(
Config {
speed: 2.0,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
2.0,
),
(
Config {
speed: 0.5,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
0.5,
),
// test with a segment
(
Config {
speed: 2.0,
segment: vec![10.0, 30.0],
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
2.0,
),
(
Config {
speed: 0.4,
autoplay: true,
segment: vec![10.0, 30.0],
use_frame_interpolation: false,
..Config::default()
},
0.4,
),
];
let configs: Vec<(Config, f32)> = vec![
// test with default config
(
Config {
autoplay: true,
..Config::default()
},
1.0,
),
// test with different speeds
(
Config {
speed: 2.0,
autoplay: true,
..Config::default()
},
2.0,
),
(
Config {
speed: 0.5,
autoplay: true,
..Config::default()
},
0.5,
),
// test with a segment
(
Config {
speed: 2.0,
segment: vec![10.0, 30.0],
autoplay: true,
..Config::default()
},
2.0,
),
(
Config {
speed: 0.4,
autoplay: true,
segment: vec![10.0, 30.0],
..Config::default()
},
0.4,
),
];

for (config, expected_speed) in configs {
let player = DotLottiePlayer::new(config);
Expand Down
8 changes: 0 additions & 8 deletions dotlottie-rs/tests/stop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,53 +13,45 @@ mod tests {
let configs: Vec<Config> = vec![
Config {
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::Reverse,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::Bounce,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::ReverseBounce,
autoplay: true,
use_frame_interpolation: false,
..Config::default()
},
// test with different segments
Config {
autoplay: true,
segment: vec![10.0, 30.0],
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::Reverse,
autoplay: true,
segment: vec![10.0, 30.0],
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::Bounce,
autoplay: true,
segment: vec![10.0, 30.0],
use_frame_interpolation: false,
..Config::default()
},
Config {
mode: Mode::ReverseBounce,
autoplay: true,
segment: vec![10.0, 30.0],
use_frame_interpolation: false,
..Config::default()
},
];
Expand Down

0 comments on commit 00e2239

Please sign in to comment.