mirror of
https://github.com/LegitCamper/picocalc-os-rs.git
synced 2026-04-24 14:07:03 +00:00
better draw without copy
This commit is contained in:
@@ -1,8 +1,8 @@
|
|||||||
use alloc::{string::ToString, vec::Vec};
|
use alloc::{string::ToString, vec::Vec};
|
||||||
use core::{ffi::c_char, ptr, sync::atomic::Ordering};
|
use core::{ffi::c_char, ptr, slice, sync::atomic::Ordering};
|
||||||
use embassy_rp::clocks::{RoscRng, clk_sys_freq};
|
use embassy_rp::clocks::{RoscRng, clk_sys_freq};
|
||||||
use embassy_time::Instant;
|
use embassy_time::Instant;
|
||||||
use embedded_graphics::draw_target::DrawTarget;
|
use embedded_graphics::{Pixel, draw_target::DrawTarget, pixelcolor::Rgb565};
|
||||||
use embedded_sdmmc::LfnBuffer;
|
use embedded_sdmmc::LfnBuffer;
|
||||||
use heapless::spsc::Queue;
|
use heapless::spsc::Queue;
|
||||||
use userlib_sys::{
|
use userlib_sys::{
|
||||||
@@ -89,13 +89,16 @@ pub extern "C" fn get_ms() -> u64 {
|
|||||||
|
|
||||||
const _: DrawIter = draw_iter;
|
const _: DrawIter = draw_iter;
|
||||||
pub extern "C" fn draw_iter(cpixels: *const CPixel, len: usize) {
|
pub extern "C" fn draw_iter(cpixels: *const CPixel, len: usize) {
|
||||||
// SAFETY: caller guarantees `ptr` is valid for `len` bytes
|
let pixels: &[Pixel<Rgb565>] = unsafe { slice::from_raw_parts(cpixels.cast(), len) };
|
||||||
let cpixels = unsafe { core::slice::from_raw_parts(cpixels, len) };
|
|
||||||
|
|
||||||
let iter = cpixels.iter().copied().map(|c: CPixel| c.into());
|
|
||||||
|
|
||||||
FB_PAUSED.store(true, Ordering::Release);
|
FB_PAUSED.store(true, Ordering::Release);
|
||||||
unsafe { FRAMEBUFFER.as_mut().unwrap().draw_iter(iter).unwrap() }
|
unsafe {
|
||||||
|
FRAMEBUFFER
|
||||||
|
.as_mut()
|
||||||
|
.unwrap()
|
||||||
|
.draw_iter(pixels.iter().copied())
|
||||||
|
.unwrap()
|
||||||
|
}
|
||||||
FB_PAUSED.store(false, Ordering::Release);
|
FB_PAUSED.store(false, Ordering::Release);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user