feat: put_pixel #9

Merged
Sweetbread merged 2 commits from kohsine/Core:feature/put_pixel into feat/put_pixel 2024-04-01 12:58:34 +02:00
4 changed files with 126 additions and 93 deletions
Showing only changes of commit af1c36b894 - Show all commits

View File

@ -15,8 +15,8 @@ name = "con"
path = "examples/con.rs"
[[example]]
name = "sqr"
path = "examples/sqr.rs"
name = "dark"
path = "examples/dark.rs"
[profile.release]
opt-level = "z"

118
examples/dark.rs Normal file
View File

@ -0,0 +1,118 @@
#![no_std]
#![no_main]
use cstr_core::{cstr, CStr};
use kos::{
graphics::{display_message, Color, Dot, Size},
input::fetch_key,
threads::{exit, fetch_event, Event},
windows::{
define_button, define_window, end_window_draw, get_button_id, invert_pixel,
start_window_draw, WindowKind, WindowParams, CLOSE_BUTTON,
},
};
const HEADER: &CStr = cstr!("Dark Mode Demo");
const TEXT: [&CStr; 6] = [
cstr!("Lorem ipsum dolor sit amet,"),
cstr!("semper et rutrum placerat,"),
cstr!("Integer sed diam commodo quam varius"),
cstr!("Sed finibus urna sit amet felis"),
cstr!("vestibulum elementum. Maecenas at feugiat lacus"),
cstr!("tristique et sit amet tortor."),
];
const BTN: u32 = 42;
const WINDOW_SIZE: Size = Size {
width: 400,
height: 400,
};
extern crate alloc;
fn draw_window(invert: bool) {
start_window_draw();
define_window(
Dot { x: 50, y: 50 },
WINDOW_SIZE,
WindowParams {
color: Color::rgb(0xff, 0xff, 0xff),
kind: WindowKind::FixedThemed,
title: Some(HEADER),
},
);
display_message(Dot { x: 10, y: 10 }, Color::rgb(0, 0, 0), TEXT[0], None);
display_message(Dot { x: 10, y: 50 }, Color::rgb(0, 0, 0), TEXT[1], None);
display_message(Dot { x: 10, y: 90 }, Color::rgb(0, 0, 0), TEXT[2], None);
display_message(Dot { x: 10, y: 130 }, Color::rgb(0, 0, 0), TEXT[3], None);
display_message(Dot { x: 10, y: 170 }, Color::rgb(0, 0, 0), TEXT[4], None);
display_message(Dot { x: 10, y: 210 }, Color::rgb(0, 0, 0), TEXT[5], None);
define_button(
Dot { x: 10, y: 300 },
Size {
width: 100,
height: 30,
},
BTN,
true,
true,
Some(Color::rgb(147, 112, 219)),
);
display_message(
Dot { x: 20, y: 310 },
Color::rgb(255, 255, 255),
if invert {
cstr!("Light mode")
} else {
cstr!("Dark mode")
},
None,
);
if invert {
for x in 0..WINDOW_SIZE.width {
for y in 0..WINDOW_SIZE.height {
invert_pixel(Dot { x, y })
}
}
}
end_window_draw();
return;
}
fn button_handler(invert: &mut bool) {
let btn_id = get_button_id();
if btn_id.is_some() {
match btn_id.unwrap() {
CLOSE_BUTTON => exit(),
BTN => {
*invert = !*invert;
draw_window(*invert);
}
_ => {}
}
}
}
#[no_mangle]
fn kol_main() {
let mut invert = false;
while let Some(ev) =
fetch_event((Event::Redraw as u32) | (Event::KeyPress as u32) | (Event::BtnPress as u32))
{
match ev {
Event::Redraw => draw_window(invert),
Event::KeyPress => drop(fetch_key()),
Event::BtnPress => button_handler(&mut invert),
_ => break,
}
}
}

View File

@ -1,88 +0,0 @@
#![no_std]
#![no_main]
use alloc::vec::Vec;
use cstr_core::{cstr, CStr};
use kos::{
graphics::{display_message, Color, Dot, Size},
input::fetch_key,
system::{get_lang, Lang},
threads::{exit, fetch_event, Event},
windows::{
define_button, define_window, end_window_draw, get_button_id, put_pixel, start_window_draw,
WindowKind, WindowParams, CLOSE_BUTTON,
},
};
const HEADER: &CStr = cstr!("Hey Kolibri");
const MSG: &CStr = cstr!("Hello GSoC 2024");
const BTN: u32 = 42;
const COLORS: [(u8, u8, u8); 3] = [(255, 0, 0), (0, 255, 0), (0, 0, 255)];
#[macro_use]
extern crate alloc;
fn draw_window(c: usize) {
start_window_draw();
define_window(
Dot { x: 50, y: 50 },
Size {
width: 500,
height: 500,
},
WindowParams {
color: Color::rgb(0xff, 0xff, 0xff),
kind: WindowKind::Themed,
title: Some(HEADER),
},
);
for i in 60..300 {
for j in 60..300 {
put_pixel(Dot { x: i, y: j }, Some(Color::rgb(255, 0, 0)), None);
}
}
for i in 200..440 {
for j in 200..440 {
put_pixel(Dot { x: i, y: j }, None, Some(true));
}
}
end_window_draw();
return;
}
fn button_handler(c: &mut usize) {
let btn_id = get_button_id();
if btn_id.is_some() {
match btn_id.unwrap() {
CLOSE_BUTTON => exit(),
BTN => {
*c += 1;
draw_window(*c);
}
_ => {}
}
}
}
#[no_mangle]
fn kol_main() {
let mut c = 0;
while let Some(ev) =
fetch_event((Event::Redraw as u32) | (Event::KeyPress as u32) | (Event::BtnPress as u32))
{
match ev {
Event::Redraw => draw_window(c),
Event::KeyPress => drop(fetch_key()),
Event::BtnPress => button_handler(&mut c),
_ => break,
}
}
}

View File

@ -39,10 +39,13 @@ pub fn define_window(start: Dot, size: Size, params: WindowParams<'_>) {
}
}
pub fn put_pixel(pos: Dot, color: Option<Color>, invert: Option<bool>) {
let invert: u32 = invert.unwrap_or(false) as u32;
pub fn put_pixel(pos: Dot, color: Option<Color>) {

And invert's type better to replace with just bool, 'cuz anyway there are 2 options: None or Some(true)

And `invert`'s type better to replace with just bool, 'cuz anyway there are 2 options: `None` or `Some(true)`

Hm, there are two another options: draw a pixel with given color or invert, so better do inversion if color is null

Hm, there are two another options: draw a pixel with given color or invert, so better do inversion if `color` is null

Hm, there are two another options: draw a pixel with given color or invert, so better do inversion if color is null

Ya I like this

> Hm, there are two another options: draw a pixel with given color or invert, so better do inversion if `color` is null Ya I like this
let color: u32 = color.unwrap_or(Color::rgb(255, 255, 255)).as_rgb_val();
unsafe { sys::put_pixel(pos.x, pos.y, invert << 24 | color) }
unsafe { sys::put_pixel(pos.x, pos.y, color) }
}
pub fn invert_pixel(pos: Dot) {
unsafe { sys::put_pixel(pos.x, pos.y, 1 << 24) }
}
pub fn define_button(