Skip to content

Commit

Permalink
user: bugfix #148: Optimize GUI
Browse files Browse the repository at this point in the history
User should call sys_framebuffer_flush only once after the modification
on the framebuffer has been completed.
This commit also renames some gui apps.
  • Loading branch information
wyfcyx committed Jun 30, 2024
1 parent 868f00b commit 81d10f2
Show file tree
Hide file tree
Showing 6 changed files with 89 additions and 141 deletions.
82 changes: 82 additions & 0 deletions user/src/bin/gui_move.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
#![no_std]
#![no_main]

extern crate user_lib;
extern crate alloc;

use user_lib::console::getchar;
use user_lib::{Display, VIRTGPU_XRES, VIRTGPU_YRES};

use embedded_graphics::pixelcolor::Rgb888;
use embedded_graphics::prelude::{Drawable, Point, RgbColor, Size};
use embedded_graphics::primitives::Primitive;
use embedded_graphics::primitives::{PrimitiveStyle, Rectangle};
use embedded_graphics::draw_target::DrawTarget;

const INIT_X: i32 = 640;
const INIT_Y: i32 = 400;
const RECT_SIZE: u32 = 40;

pub struct DrawingBoard {
disp: Display,
latest_pos: Point,
}

impl DrawingBoard {
pub fn new() -> Self {
Self {
disp: Display::new(Size::new(VIRTGPU_XRES, VIRTGPU_YRES)),
latest_pos: Point::new(INIT_X, INIT_Y),
}
}
fn paint(&mut self) {
Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE))
.into_styled(PrimitiveStyle::with_stroke(Rgb888::WHITE, 1))
.draw(&mut self.disp)
.ok();
}
fn unpaint(&mut self) {
Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE))
.into_styled(PrimitiveStyle::with_stroke(Rgb888::BLACK, 1))
.draw(&mut self.disp)
.ok();
}
pub fn move_rect(&mut self, dx: i32, dy: i32) {
let new_x = self.latest_pos.x + dx;
let new_y = self.latest_pos.y + dy;
let r = (RECT_SIZE / 2) as i32;
if new_x > r && new_x + r < (VIRTGPU_XRES as i32) && new_y > r && new_y + r < (VIRTGPU_YRES as i32) {
self.unpaint();
self.latest_pos.x = new_x;
self.latest_pos.y = new_y;
self.paint();
}
}
}

const LF: u8 = 0x0au8;
const CR: u8 = 0x0du8;
#[no_mangle]
pub fn main() -> i32 {
let mut board = DrawingBoard::new();
let _ = board.disp.clear(Rgb888::BLACK).unwrap();
board.disp.flush();
loop {
let c = getchar();
if c == LF || c == CR {
break;
}
let mut moved = true;
match c {
b'w' => board.move_rect(0, -10),
b'a' => board.move_rect(-10, 0),
b's' => board.move_rect(0, 10),
b'd' => board.move_rect(10, 0),
_ => moved = false,
}
if moved {
board.disp.flush();
}
}
0
}
14 changes: 1 addition & 13 deletions user/src/bin/gui_rect.rs → user/src/bin/gui_shape.rs
Original file line number Diff line number Diff line change
Expand Up @@ -44,18 +44,6 @@ impl DrawingBoard {
.draw(&mut self.disp)
.ok();
}
fn unpaint(&mut self) {
Rectangle::with_center(self.latest_pos, Size::new(RECT_SIZE, RECT_SIZE))
.into_styled(PrimitiveStyle::with_stroke(Rgb888::BLACK, 10))
.draw(&mut self.disp)
.ok();
}
pub fn move_rect(&mut self, dx: i32, dy: i32) {
self.unpaint();
self.latest_pos.x += dx;
self.latest_pos.y += dy;
self.paint();
}
}

#[no_mangle]
Expand All @@ -64,8 +52,8 @@ pub fn main() -> i32 {
let _ = board.disp.clear(Rgb888::BLACK).unwrap();
for _ in 0..5 {
board.latest_pos.x += RECT_SIZE as i32 + 20;
//board.latest_pos.y += i;
board.paint();
}
board.disp.flush();
0
}
5 changes: 3 additions & 2 deletions user/src/bin/gui_snake.rs
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ const CR: u8 = 0x0du8;
#[no_mangle]
pub fn main() -> i32 {
let mut disp = Display::new(Size::new(VIRTGPU_XRES, VIRTGPU_YRES));
let mut game = SnakeGame::<20, Rgb888>::new(1280, 800, 20, 20, Rgb888::RED, Rgb888::YELLOW, 50);
let mut game = SnakeGame::<20, Rgb888>::new(1280, 800, 20, 20, Rgb888::RED, Rgb888::YELLOW, 200);
let _ = disp.clear(Rgb888::BLACK).unwrap();
loop {
if key_pressed() {
Expand All @@ -345,7 +345,8 @@ pub fn main() -> i32 {
}
let _ = disp.clear(Rgb888::BLACK).unwrap();
game.draw(&mut disp);
sleep(10);
disp.flush();
sleep(40);
}
0
}
1 change: 1 addition & 0 deletions user/src/bin/gui_simple.rs → user/src/bin/gui_tri.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ pub fn main() -> i32 {
}
}
});
disp.flush();
0
}
125 changes: 0 additions & 125 deletions user/src/bin/gui_uart.rs

This file was deleted.

3 changes: 2 additions & 1 deletion user/src/io.rs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ impl Display {
}
pub fn paint_on_framebuffer(&mut self, p: impl FnOnce(&mut [u8]) -> ()) {
p(self.framebuffer());
}
pub fn flush(&self) {
framebuffer_flush();
}
}
Expand Down Expand Up @@ -60,7 +62,6 @@ impl DrawTarget for Display {
self.fb[idx + 1] = px.1.g();
self.fb[idx + 2] = px.1.r();
});
framebuffer_flush();
Ok(())
}
}
Expand Down

0 comments on commit 81d10f2

Please sign in to comment.