diff --git a/Cargo.toml b/Cargo.toml index 287b0b3..28b3565 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "framebuffer" version = "0.3.1" authors = ["Roy van der Vegt "] -edition = "2018" +edition = "2021" description = """ Basic framebuffer abstraction. Handles the necessary ioctls and mmaps the framebuffer device. """ @@ -16,8 +16,8 @@ path = "src/lib.rs" [dependencies] libc = "0.2" -memmap = "0.7" -errno = "0.2.7" +memmap2 = "0.6.1" +errno = "0.3" [[example]] name = "rust-logo" @@ -36,5 +36,5 @@ name = "sierpinski" path = "examples/sierpinski/main.rs" [dev_dependencies] -bmp = "0.1.4" +image = "0.24" rand = "0.8" diff --git a/examples/mandelbrot/main.rs b/examples/mandelbrot/main.rs index 2de6512..32c57fd 100644 --- a/examples/mandelbrot/main.rs +++ b/examples/mandelbrot/main.rs @@ -1,5 +1,3 @@ -extern crate framebuffer; - use framebuffer::{Framebuffer, KdMode}; //Algorithm copied from: @@ -40,7 +38,7 @@ fn main() { } } - let _ = framebuffer.write_frame(&frame); + framebuffer.write_frame(&frame); std::io::stdin().read_line(&mut String::new()).unwrap(); let _ = Framebuffer::set_kd_mode(KdMode::Text).unwrap(); diff --git a/examples/rust-logo/main.rs b/examples/rust-logo/main.rs index c3ebcea..29caa21 100644 --- a/examples/rust-logo/main.rs +++ b/examples/rust-logo/main.rs @@ -1,6 +1,3 @@ -extern crate bmp; -extern crate framebuffer; - use framebuffer::{Framebuffer, KdMode}; fn main() { @@ -12,21 +9,28 @@ fn main() { let bytespp = framebuffer.var_screen_info.bits_per_pixel / 8; let mut frame = vec![0u8; (line_length * h) as usize]; - let img = bmp::open("examples/rust-logo/rust-logo.bmp").unwrap(); + + let img = image::io::Reader::open("examples/rust-logo/rust-logo.bmp") + .unwrap() + .decode() + .unwrap(); //Disable text mode in current tty let _ = Framebuffer::set_kd_mode(KdMode::Graphics).unwrap(); - for offset in 0..w - img.get_width() { - for (x, y) in img.coordinates() { - let px = img.get_pixel(x, y); - let start_index = (y * line_length + (offset + x) * bytespp) as usize; - frame[start_index] = px.b; - frame[start_index + 1] = px.g; - frame[start_index + 2] = px.r; + for offset in 0..w - img.width() { + for x in 0..img.width() { + for y in 0..img.height() { + use image::GenericImageView; + let px: image::Rgba = img.get_pixel(x, y); + let start_index = (y * line_length + (offset + x) * bytespp) as usize; + frame[start_index] = px.0[0]; + frame[start_index + 1] = px.0[1]; + frame[start_index + 2] = px.0[2]; + } } - let _ = framebuffer.write_frame(&frame); + framebuffer.write_frame(&frame); } //Reenable text mode in current tty diff --git a/examples/sierpinski/main.rs b/examples/sierpinski/main.rs index 91d4e68..11a571e 100644 --- a/examples/sierpinski/main.rs +++ b/examples/sierpinski/main.rs @@ -1,5 +1,3 @@ -extern crate framebuffer; - use framebuffer::{Framebuffer, KdMode}; fn main() { @@ -43,7 +41,7 @@ fn main() { } } - let _ = framebuffer.write_frame(&frame); + framebuffer.write_frame(&frame); let _ = std::io::stdin().read_line(&mut String::new()); let _ = Framebuffer::set_kd_mode(KdMode::Text).unwrap(); } diff --git a/examples/starfield/main.rs b/examples/starfield/main.rs index 875b7e4..ae0726b 100644 --- a/examples/starfield/main.rs +++ b/examples/starfield/main.rs @@ -1,6 +1,3 @@ -extern crate framebuffer; -extern crate rand; - use framebuffer::Framebuffer; use rand::Rng; @@ -27,7 +24,7 @@ impl Starfield { for star in stars.iter_mut() { *star = Star::new_rand(w, h); } - Starfield { stars: stars } + Starfield { stars } } fn tick(&mut self, framebuffer: &Framebuffer, frame: &mut [u8]) { @@ -35,13 +32,18 @@ impl Starfield { let h = framebuffer.var_screen_info.yres as usize; for star in self.stars.iter_mut() { - Starfield::draw_star(&star, framebuffer, frame, (0, 0, 0)); + Starfield::draw_star(star, framebuffer, frame, (0, 0, 0)); star.tick(w, h); - Starfield::draw_star(&star, framebuffer, frame, star.color); + Starfield::draw_star(star, framebuffer, frame, star.color); } } - fn draw_star(star_data: &Star, framebuffer: &Framebuffer, frame: &mut [u8], color: (u8, u8, u8)) { + fn draw_star( + star_data: &Star, + framebuffer: &Framebuffer, + frame: &mut [u8], + color: (u8, u8, u8), + ) { let w = framebuffer.var_screen_info.xres as usize; let h = framebuffer.var_screen_info.yres as usize; @@ -139,7 +141,7 @@ fn main() { loop { starfield.tick(&framebuffer, &mut frame); - let _ = framebuffer.write_frame(&frame); + framebuffer.write_frame(&frame); } //Reenable text mode in current tty diff --git a/src/lib.rs b/src/lib.rs index 820687e..97ef8f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,9 +1,5 @@ //!Simple linux framebuffer abstraction. //!Examples can be found [here](https://github.com/Roysten/rust-framebuffer/tree/master/examples). - -extern crate libc; -extern crate memmap; - use libc::ioctl; use std::fmt; @@ -12,7 +8,7 @@ use std::os::unix::io::AsRawFd; use std::path::Path; use errno::errno; -use memmap::{MmapMut, MmapOptions}; +use memmap2::{MmapMut, MmapOptions}; const FBIOGET_VSCREENINFO: libc::c_ulong = 0x4600; const FBIOPUT_VSCREENINFO: libc::c_ulong = 0x4601; @@ -191,7 +187,7 @@ impl Framebuffer { ///Writes a frame to the Framebuffer. pub fn write_frame(&mut self, frame: &[u8]) { - self.frame[..].copy_from_slice(&frame[..]); + self.frame[..].copy_from_slice(frame); } ///Reads a frame from the framebuffer. @@ -238,10 +234,7 @@ impl Framebuffer { } } - pub fn pan_display( - device: &File, - screeninfo: &VarScreeninfo, - ) -> Result { + pub fn pan_display(device: &File, screeninfo: &VarScreeninfo) -> Result { match unsafe { ioctl(device.as_raw_fd(), FBIOPAN_DISPLAY as _, screeninfo) } { -1 => Err(FramebufferError::new( FramebufferErrorKind::IoctlFailed,