logitech-lcd 2.0.0

Rust bindings for the Logitech Gaming LCD/Gamepanel SDK.
Documentation
extern crate image;
extern crate logitech_lcd;

use logitech_lcd::{Lcd, COLOR_WIDTH, COLOR_HEIGHT};
use image::{ImageFormat, ImageRgba8, Pixel, Rgba};

fn load_image_into_buffer() -> Vec<u8> {
    let logo_data = include_bytes!("rust-logo-128x128.png");
    let logo_img = match image::load_from_memory_with_format(logo_data, ImageFormat::PNG).unwrap() {
        ImageRgba8(img) => img,
        _ => panic!("unexpected image format"),
    };

    let mut buf = std::iter::repeat(255u8)
        .take(COLOR_WIDTH * COLOR_HEIGHT * 4)
        .collect::<Vec<u8>>();

    let mx = (COLOR_WIDTH  - logo_img.width()  as usize) / 2;
    let my = (COLOR_HEIGHT - logo_img.height() as usize) / 2;

    for p in logo_img.enumerate_pixels() {
        let x = mx + p.0 as usize;
        let y = my + p.1 as usize;
        let i = y * 4 * COLOR_WIDTH + x * 4;
        let mut b = Rgba::from_channels(buf[i+2], buf[i+1], buf[i+0], buf[i+3]);
        b.blend(p.2);
        buf[i] = b.data[2];
        buf[i + 1] = b.data[1];
        buf[i + 2] = b.data[0];
        buf[i + 3] = b.data[3];
    }

    buf
}


fn main() {
    let buf = load_image_into_buffer();

    let mut lcd = Lcd::init_color("Color image app").unwrap();
    lcd.set_color_background(&buf[..]).unwrap();
    lcd.update();

    std::thread::sleep(std::time::Duration::from_millis(10000));
}