3 unstable releases

0.2.1 Oct 21, 2019
0.2.0 Oct 21, 2019
0.1.0 Sep 16, 2019

#27 in #framebuffer

MIT license

33KB
630 lines

linfb is a drawing library that uses Linux' /dev/fb0 device as it's backend. For most tasks you probably want to use OpenGL or Vulkan backed library. /dev/fb0 is deprecated but still useful for some specific cases. This library supports framebuffers that use 32 bits per pixel, so (theoretically) most modern systems.

Before drawing on framebuffer you should allocate a virtual terminal and switch to it. I recommend using vt crates for this task. You should never draw on virtual terminal used by X.org/Wayland server, this is unsafe and can lead to panics.

By default linfb includes text and images drawing capabilities, which brings additional dependencies. You can disable these features if you only need low-level framebuffer interactions and Shape trait.

Basic usage can look like this:

use linfb::Framebuffer;
use linfb::shape::{Color, Shape, Rectangle, Caption, Image, FontBuilder, Alignment};
let mut framebuffer = Framebuffer::open()
    .expect("Failed to open framebuffer");
let mut compositor = framebuffer.compositor((255, 255, 255).into());
compositor
    .add("rect1", Rectangle::builder()
        .width(100)
        .height(100)
        .fill_color(Color::hex("#ff000099").unwrap())
        .build()
        .unwrap()
        .at(100, 100))
    .add("rect2", Rectangle::builder()
        .width(100)
        .height(100)
        .fill_color(Color::hex("#00ff0099").unwrap())
        .build()
        .unwrap()
        .at(150, 150))
    .add("image", Image::from_path("image.png")
        .unwrap()
        .at(500, 500))
    .add("wrapped_text", Caption::builder()
        .text("Some centered text\nwith newlines".into())
        .size(56)
        .color(Color::hex("#4066b877").unwrap())
        .font(FontBuilder::default()
              .family("monospace")
              .build()
              .unwrap()
        )
        .alignment(Alignment::Center)
        .max_width(650)
        .build()
        .unwrap()
        .at(1000, 300));
// Compositor is shape, so we can just draw it at the top left angle
framebuffer.draw(0, 0, &compositor);
// Really changing screen contents
framebuffer.flush();

Dependencies

~4–6.5MB
~134K SLoC