|
|
|
|
@ -16,7 +16,7 @@ use crate::file; |
|
|
|
|
type Glyph = Vec<Point>; |
|
|
|
|
|
|
|
|
|
struct GlyphMetrics { |
|
|
|
|
width: usize, |
|
|
|
|
width: usize, |
|
|
|
|
height: usize, |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -64,20 +64,20 @@ enum Colors { |
|
|
|
|
impl Colors { |
|
|
|
|
fn color(&self) -> ColorRGB { |
|
|
|
|
match self { |
|
|
|
|
Colors::Background => ColorRGB::new( 32, 32, 32), |
|
|
|
|
Colors::Foreground => ColorRGB::new(255, 255, 255), |
|
|
|
|
Colors::Error => ColorRGB::new(255, 0, 0), |
|
|
|
|
Colors::Warning => ColorRGB::new(255, 170, 0), |
|
|
|
|
Colors::FindBg => ColorRGB::new(246, 185, 63), |
|
|
|
|
Colors::StdFunction => ColorRGB::new(170, 255, 255), |
|
|
|
|
Colors::Comment => ColorRGB::new( 0, 255, 0), |
|
|
|
|
Colors::Keyword => ColorRGB::new( 0, 170, 255), |
|
|
|
|
Colors::Number => ColorRGB::new( 85, 255, 255), |
|
|
|
|
Colors::Operator => ColorRGB::new(255, 85, 0), |
|
|
|
|
Colors::Preprocessor => ColorRGB::new(127, 0, 0), |
|
|
|
|
Colors::SelectionBg => ColorRGB::new(110, 161, 241), |
|
|
|
|
Colors::SelectionFg => ColorRGB::new(255, 255, 255), |
|
|
|
|
Colors::String => ColorRGB::new(255, 85, 255), |
|
|
|
|
Colors::Background => ColorRGB::new(32, 32, 32), |
|
|
|
|
Colors::Foreground => ColorRGB::new(255, 255, 255), |
|
|
|
|
Colors::Error => ColorRGB::new(255, 0, 0), |
|
|
|
|
Colors::Warning => ColorRGB::new(255, 170, 0), |
|
|
|
|
Colors::FindBg => ColorRGB::new(246, 185, 63), |
|
|
|
|
Colors::StdFunction => ColorRGB::new(170, 255, 255), |
|
|
|
|
Colors::Comment => ColorRGB::new(0, 255, 0), |
|
|
|
|
Colors::Keyword => ColorRGB::new(0, 170, 255), |
|
|
|
|
Colors::Number => ColorRGB::new(85, 255, 255), |
|
|
|
|
Colors::Operator => ColorRGB::new(255, 85, 0), |
|
|
|
|
Colors::Preprocessor => ColorRGB::new(127, 0, 0), |
|
|
|
|
Colors::SelectionBg => ColorRGB::new(110, 161, 241), |
|
|
|
|
Colors::SelectionFg => ColorRGB::new(255, 255, 255), |
|
|
|
|
Colors::String => ColorRGB::new(255, 85, 255), |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -89,17 +89,20 @@ pub fn generate_glyph_data() -> Result<GlyphAtlas, String> { |
|
|
|
|
let contents = file::read_file(file_path)?; |
|
|
|
|
|
|
|
|
|
// Get glyph metrics
|
|
|
|
|
let glyph_metrics = GlyphMetrics { width: 8, height: 16 }; |
|
|
|
|
let glyph_width = glyph_metrics.width; |
|
|
|
|
let glyph_metrics = GlyphMetrics { |
|
|
|
|
width: 8, |
|
|
|
|
height: 16, |
|
|
|
|
}; |
|
|
|
|
let glyph_width = glyph_metrics.width; |
|
|
|
|
|
|
|
|
|
// Get width of image for proper positioning of pixels
|
|
|
|
|
let width_left_byte = contents[0]; |
|
|
|
|
let width_left_byte = contents[0]; |
|
|
|
|
let width_right_byte = contents[1]; |
|
|
|
|
let width_bytes = [width_left_byte, width_right_byte]; |
|
|
|
|
let width = u16::from_be_bytes(width_bytes); |
|
|
|
|
println!("Left Byte: {width_left_byte}, Right Byte: {width_right_byte}, Byte Pair: {width}"); |
|
|
|
|
|
|
|
|
|
let pruned_glyph_table = &contents[width as usize + 2 ..]; |
|
|
|
|
let pruned_glyph_table = &contents[width as usize + 2..]; |
|
|
|
|
|
|
|
|
|
// Generate the glyph atlas
|
|
|
|
|
let mut glyph_atlas: Vec<Glyph> = vec![]; |
|
|
|
|
@ -121,15 +124,23 @@ pub fn generate_glyph_data() -> Result<GlyphAtlas, String> { |
|
|
|
|
} |
|
|
|
|
glyph_atlas.push(new_glyph); |
|
|
|
|
} |
|
|
|
|
Ok(GlyphAtlas { glyphs: glyph_atlas, metrics: glyph_metrics }) |
|
|
|
|
Ok(GlyphAtlas { |
|
|
|
|
glyphs: glyph_atlas, |
|
|
|
|
metrics: glyph_metrics, |
|
|
|
|
}) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Method for generating points to render, using given string
|
|
|
|
|
fn draw_text(glyph_atlas: &GlyphAtlas, content: &str, offset: Point) -> Vec<Point> { |
|
|
|
|
fn draw_text( |
|
|
|
|
glyph_atlas: &GlyphAtlas, |
|
|
|
|
window_size: (u32, u32), |
|
|
|
|
content: &str, |
|
|
|
|
offset: Point, |
|
|
|
|
) -> Vec<Point> { |
|
|
|
|
let mut points: Vec<Point> = vec![]; |
|
|
|
|
|
|
|
|
|
let glyph_width = glyph_atlas.metrics.width; |
|
|
|
|
let glyph_height = glyph_atlas.metrics.height; |
|
|
|
|
let glyph_width = glyph_atlas.metrics.width; |
|
|
|
|
let glyph_height = glyph_atlas.metrics.height; |
|
|
|
|
|
|
|
|
|
let content_lines = content.split('\n'); |
|
|
|
|
for (y, line) in content_lines.enumerate() { |
|
|
|
|
@ -147,20 +158,30 @@ fn draw_text(glyph_atlas: &GlyphAtlas, content: &str, offset: Point) -> Vec<Poin |
|
|
|
|
|
|
|
|
|
let positioned_pixel = Point::new( |
|
|
|
|
pixel.x + x_glyph as i32 + offset.x, |
|
|
|
|
pixel.y + y_glyph as i32 + offset.y |
|
|
|
|
pixel.y + y_glyph as i32 + offset.y, |
|
|
|
|
); |
|
|
|
|
points.push(positioned_pixel); |
|
|
|
|
} |
|
|
|
|
// TODO: Limit X drawing
|
|
|
|
|
|
|
|
|
|
if x >= (window_size.0 as usize / glyph_width) - 3 { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if y >= (window_size.1 as usize / glyph_height) - 3 { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
// TODO: Limit Y drawing
|
|
|
|
|
} |
|
|
|
|
points |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pub fn draw_cursor(glyph_atlas: &GlyphAtlas, mut cursor_position: usize, content: &str, offset: Point) -> (Point, Point) { |
|
|
|
|
let glyph_width = glyph_atlas.metrics.width; |
|
|
|
|
let glyph_height = glyph_atlas.metrics.height; |
|
|
|
|
pub fn draw_cursor( |
|
|
|
|
glyph_atlas: &GlyphAtlas, |
|
|
|
|
mut cursor_position: usize, |
|
|
|
|
content: &str, |
|
|
|
|
offset: Point, |
|
|
|
|
) -> (Point, Point) { |
|
|
|
|
let glyph_width = glyph_atlas.metrics.width; |
|
|
|
|
let glyph_height = glyph_atlas.metrics.height; |
|
|
|
|
|
|
|
|
|
let mut x = 0; |
|
|
|
|
let mut y = 0; |
|
|
|
|
@ -173,24 +194,28 @@ pub fn draw_cursor(glyph_atlas: &GlyphAtlas, mut cursor_position: usize, content |
|
|
|
|
y += 1; |
|
|
|
|
} |
|
|
|
|
if idx == cursor_position { |
|
|
|
|
let point_a = Point::new((x * glyph_width) as i32 + offset.x, |
|
|
|
|
(y * glyph_height) as i32 + offset.y |
|
|
|
|
); |
|
|
|
|
let point_b = Point::new(point_a.x, |
|
|
|
|
point_a.y + glyph_height as i32 |
|
|
|
|
let point_a = Point::new( |
|
|
|
|
(x * glyph_width) as i32 + offset.x, |
|
|
|
|
(y * glyph_height) as i32 + offset.y, |
|
|
|
|
); |
|
|
|
|
return (point_a, point_b) |
|
|
|
|
let point_b = Point::new(point_a.x, point_a.y + glyph_height as i32); |
|
|
|
|
return (point_a, point_b); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
(Point::new(offset.x, offset.y), Point::new(offset.x, offset.y + glyph_height as i32)) |
|
|
|
|
( |
|
|
|
|
Point::new(offset.x, offset.y), |
|
|
|
|
Point::new(offset.x, offset.y + glyph_height as i32), |
|
|
|
|
) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/// Draw all contents to the window
|
|
|
|
|
pub fn draw_everything(canvas: &mut Canvas<Window>, |
|
|
|
|
glyph_atlas: &GlyphAtlas, |
|
|
|
|
buffer: &str, |
|
|
|
|
cursor_position: usize) -> Result<(), String> { |
|
|
|
|
pub fn draw_everything( |
|
|
|
|
canvas: &mut Canvas<Window>, |
|
|
|
|
glyph_atlas: &GlyphAtlas, |
|
|
|
|
buffer: &str, |
|
|
|
|
cursor_position: usize, |
|
|
|
|
) -> Result<(), String> { |
|
|
|
|
// Quick initialization
|
|
|
|
|
let window_size = canvas.output_size()?; |
|
|
|
|
let text_offset = Point::new(10, 10); |
|
|
|
|
@ -204,25 +229,26 @@ pub fn draw_everything(canvas: &mut Canvas<Window>, |
|
|
|
|
|
|
|
|
|
// Draw text
|
|
|
|
|
canvas.set_draw_color(Color::RGB(fg_color.red, fg_color.green, fg_color.blue)); |
|
|
|
|
let fb_text = draw_text(&glyph_atlas, buffer, text_offset); |
|
|
|
|
let fb_text = draw_text(&glyph_atlas, window_size, buffer, text_offset); |
|
|
|
|
canvas.draw_points(&fb_text[..])?; |
|
|
|
|
|
|
|
|
|
// Draw info
|
|
|
|
|
let status = buffer.len().to_formatted_string(&Locale::en); |
|
|
|
|
let status_position = Point::new( |
|
|
|
|
text_offset.x, |
|
|
|
|
window_size.1 as i32 - glyph_atlas.metrics.height as i32 * 2 |
|
|
|
|
window_size.1 as i32 - glyph_atlas.metrics.height as i32 * 2, |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
canvas.set_draw_color(Color::RGB(16, 64, 64)); |
|
|
|
|
canvas.fill_rect(Rect::new(0, |
|
|
|
|
status_position.y - 5, |
|
|
|
|
window_size.0, |
|
|
|
|
glyph_atlas.metrics.height as u32 + 10 |
|
|
|
|
canvas.fill_rect(Rect::new( |
|
|
|
|
0, |
|
|
|
|
status_position.y - 5, |
|
|
|
|
window_size.0, |
|
|
|
|
glyph_atlas.metrics.height as u32 + 10, |
|
|
|
|
))?; |
|
|
|
|
|
|
|
|
|
canvas.set_draw_color(Color::RGB(127, 240, 240)); |
|
|
|
|
let status_bar = draw_text(&glyph_atlas, &status, status_position); |
|
|
|
|
let status_bar = draw_text(&glyph_atlas, window_size, &status, status_position); |
|
|
|
|
canvas.draw_points(&status_bar[..])?; |
|
|
|
|
|
|
|
|
|
// Draw cursor
|
|
|
|
|
|