A simple CPU rendered GUI IDE experience.
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 58 |
1 files changed, 41 insertions, 17 deletions
diff --git a/src/main.rs b/src/main.rs index 378cdcf..99ccab7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,11 +2,11 @@ #![allow(incomplete_features, redundant_semicolons)] use std::num::NonZeroU32; use std::sync::LazyLock; +use std::time::Instant; -use dsb::cell::Style; use fimg::Image; use swash::FontRef; -use winit::event::{ElementState, Event, KeyEvent, WindowEvent}; +use winit::event::{ElementState, Event, MouseScrollDelta, WindowEvent}; use winit::event_loop::{ControlFlow, EventLoop}; use winit::keyboard::{Key, NamedKey}; @@ -21,7 +21,8 @@ fn main() { #[implicit_fn::implicit_fn] pub(crate) fn entry(event_loop: EventLoop<()>) { let ppem = 20.0; - let ls = 20.0; + let ls = 20.0; let mut vo = 0; + let mut text = TextArea::default(); std::env::args().nth(1).map(|x| { text.insert(&std::fs::read_to_string(x).unwrap()); @@ -30,6 +31,7 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { |elwt| { let window = winit_app::make_window(elwt, |w| w); window.set_ime_allowed(true); + window.set_ime_purpose(winit::window::ImePurpose::Terminal); let context = softbuffer::Context::new(window.clone()).unwrap(); @@ -73,38 +75,45 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { (NonZeroU32::new(size.width), NonZeroU32::new(size.height)) { let (c, r) = dsb::fit(&FONT,ppem,ls, (size.width as _,size.height as _)); - let cells =text.cells((c, r),[204, 202, 194], [36, 41, 54],); - let mut r = unsafe { + let now = Instant::now(); + let cells =text.cells((c, r),[204, 202, 194], [36, 41, 54], vo); + println!("cell="); + dbg!(now.elapsed()); + let now = Instant::now(); + + let mut res = unsafe { dsb::render(&cells, (c, r), ppem, [36, 41, 54],dsb::Fonts::new(*FONT, *FONT, *FONT, *FONT), ls, true)}; - - + eprint!("rend="); + dbg!(now.elapsed()); let met = FONT.metrics(&[]); let fac = ppem / met.units_per_em as f32; + let now = Instant::now(); // if x.view_o == Some(x.cells.row) || x.view_o.is_none() { - let cell = - Image::<_, 4>::build(3, (ppem * 1.25).ceil() as u32).fill([0xFF, 0xCC, 0x66, 255]); - use fimg::OverlayAt; + use fimg::OverlayAt; let (fw, fh) = dsb::dims(&FONT, ppem); + let cell = Image::<_, 4>::build(3, (fh).ceil() as u32).fill([0xFF, 0xCC, 0x66, 255]); unsafe { let (x, y) = text.cursor(); - - r.as_mut().overlay_at( + if (vo..vo+r-1).contains(&y) { + res.as_mut().overlay_at( &cell, (x as f32 * fw).floor() as u32, - (y as f32 * (fh + ls * fac)).floor() + ((y-vo) as f32 * (fh + ls * fac)).floor() as u32, // 4 + ((x - 1) as f32 * sz) as u32, // (x as f32 * (ppem * 1.25)) as u32 - 20, - ) - }; + );} + eprint!("conv = ") + }; dbg!(now.elapsed()); + // } let mut buffer = surface.buffer_mut().unwrap(); for y in 0..height.get() { for x in 0..width.get() { - let [red, green, blue] =r.get_pixel(x, y).unwrap_or_default().map(_ as u32); + let [red, green, blue] =res.get_pixel(x, y).unwrap_or_default().map(_ as u32); let index = y as usize * width.get() as usize + x as usize; buffer[index] = blue | (green << 8) | (red << 16); } @@ -122,13 +131,28 @@ pub(crate) fn entry(event_loop: EventLoop<()>) { } if window_id == window.id() => { elwt.exit(); } + Event::WindowEvent { window_id:_, event: + WindowEvent::MouseWheel { device_id:_, delta: MouseScrollDelta::LineDelta(_, rows), phase } + } => { + if rows < 0.0 { + let rows = rows.ceil().abs() as usize; + let (_, r) = dsb::fit(&FONT,ppem,ls, (window.inner_size() .width as _,window.inner_size().height as _)); + vo = (vo + rows).min(text.l() - r); + } else { + let rows = rows.floor() as usize; + vo = vo.saturating_sub(rows); + } + window.request_redraw(); + dbg!(vo); + } Event::WindowEvent{ event:WindowEvent::KeyboardInput { device_id, event, is_synthetic }, window_id } if event.state == ElementState::Pressed => { use NamedKey::*; use Key::*; - match (event.logical_key ){ + match event.logical_key { + Named(Space)=> text.insert(" "), Named(Backspace) => text.backspace(), |