Skip to content

Commit

Permalink
store gfx::framerate::FPSmanager directly in FPSManager instead of on…
Browse files Browse the repository at this point in the history
… the heap
  • Loading branch information
antonilol committed Jun 29, 2024
1 parent a57f9ad commit 4624f25
Showing 1 changed file with 20 additions and 18 deletions.
38 changes: 20 additions & 18 deletions src/sdl2/gfx/framerate.rs
Original file line number Diff line number Diff line change
@@ -1,30 +1,36 @@
//! Framerate control
use get_error;
use libc;
use libc::{c_void, size_t};
use std::mem;
use std::mem::MaybeUninit;
use sys::gfx;

/// Structure holding the state and timing information of the framerate controller.
#[derive(Debug, Clone)]
pub struct FPSManager {
raw: *mut gfx::framerate::FPSmanager,
raw: gfx::framerate::FPSmanager,
}

impl Default for FPSManager {
fn default() -> Self {
Self::new()
}
}

impl FPSManager {
/// Create the framerate manager.
pub fn new() -> FPSManager {
unsafe {
let size = mem::size_of::<gfx::framerate::FPSmanager>() as size_t;
let raw = libc::malloc(size) as *mut gfx::framerate::FPSmanager;
gfx::framerate::SDL_initFramerate(raw);
FPSManager { raw }
let mut raw = MaybeUninit::uninit();
gfx::framerate::SDL_initFramerate(raw.as_mut_ptr());
FPSManager {
raw: raw.assume_init(),
}
}
}

/// Set the framerate in Hz.
pub fn set_framerate(&mut self, rate: u32) -> Result<(), String> {
let ret = unsafe { gfx::framerate::SDL_setFramerate(self.raw, rate) };
let ret = unsafe { gfx::framerate::SDL_setFramerate(&mut self.raw, rate) };
match ret {
0 => Ok(()),
_ => Err(get_error()),
Expand All @@ -34,23 +40,19 @@ impl FPSManager {
/// Return the current target framerate in Hz.
pub fn get_framerate(&self) -> i32 {
// will not get an error
unsafe { gfx::framerate::SDL_getFramerate(self.raw) as i32 }
// SAFETY: SDL_getFramerate will not mutate self.raw, even though it accepts *mut FPSmanager.
unsafe { gfx::framerate::SDL_getFramerate(&self.raw as *const _ as *mut _) as i32 }
}

/// Return the current framecount.
pub fn get_frame_count(&self) -> i32 {
// will not get an error
unsafe { gfx::framerate::SDL_getFramecount(self.raw) as i32 }
// SAFETY: SDL_getFramecount will not mutate self.raw, even though it accepts *mut FPSmanager.
unsafe { gfx::framerate::SDL_getFramecount(&self.raw as *const _ as *mut _) as i32 }
}

/// Delay execution to maintain a constant framerate and calculate fps.
pub fn delay(&mut self) -> u32 {
unsafe { gfx::framerate::SDL_framerateDelay(self.raw) as u32 }
}
}

impl Drop for FPSManager {
fn drop(&mut self) {
unsafe { libc::free(self.raw as *mut c_void) }
unsafe { gfx::framerate::SDL_framerateDelay(&mut self.raw) as u32 }
}
}

0 comments on commit 4624f25

Please sign in to comment.