diff options
Diffstat (limited to 'font/src/lib.rs')
-rw-r--r-- | font/src/lib.rs | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/font/src/lib.rs b/font/src/lib.rs index f9eaaac6..68935e45 100644 --- a/font/src/lib.rs +++ b/font/src/lib.rs @@ -58,6 +58,9 @@ mod darwin; #[cfg(target_os = "macos")] pub use darwin::*; +/// Width/Height of the cursor relative to the font width +pub const CURSOR_WIDTH_PERCENTAGE: i32 = 15; + /// Character used for the underline cursor // This is part of the private use area and should not conflict with any font pub const UNDERLINE_CURSOR_CHAR: char = '\u{10a3e2}'; @@ -65,8 +68,10 @@ pub const UNDERLINE_CURSOR_CHAR: char = '\u{10a3e2}'; /// Character used for the beam cursor // This is part of the private use area and should not conflict with any font pub const BEAM_CURSOR_CHAR: char = '\u{10a3e3}'; -/// Width of the beam cursor relative to the font width -pub const BEAM_CURSOR_WIDTH_PERCENTAGE: i32 = 15; + +/// Character used for the empty box cursor +// This is part of the private use area and should not conflict with any font +pub const BOX_CURSOR_CHAR: char = '\u{10a3e4}'; #[derive(Debug, Clone, PartialEq, Eq, Hash)] pub struct FontDesc { @@ -214,9 +219,8 @@ impl Default for RasterizedGlyph { // Returns a custom underline cursor character pub fn get_underline_cursor_glyph(descent: i32, width: i32) -> Result<RasterizedGlyph, Error> { - // Create a new rectangle, the height is half the distance between - // bounding box bottom and the baseline - let height = cmp::max(i32::abs(descent / 2), 1); + // Create a new rectangle, the height is relative to the font width + let height = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); let buf = vec![255u8; (width * height * 3) as usize]; // Create a custom glyph with the rectangle data attached to it @@ -237,7 +241,7 @@ pub fn get_beam_cursor_glyph( width: i32, ) -> Result<RasterizedGlyph, Error> { // Create a new rectangle that is at least one pixel wide - let beam_width = cmp::max(width * BEAM_CURSOR_WIDTH_PERCENTAGE / 100, 1); + let beam_width = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); let buf = vec![255u8; (beam_width * height * 3) as usize]; // Create a custom glyph with the rectangle data attached to it @@ -251,6 +255,37 @@ pub fn get_beam_cursor_glyph( }); } +// Returns a custom beam cursor character +pub fn get_box_cursor_glyph( + ascent: i32, + height: i32, + width: i32, +) -> Result<RasterizedGlyph, Error> { + // Create a new box outline rectangle + let border_width = cmp::max(width * CURSOR_WIDTH_PERCENTAGE / 100, 1); + let mut buf = Vec::with_capacity((width * height * 3) as usize); + for y in 0..height { + for x in 0..width { + if y < border_width || y >= height - border_width || + x < border_width || x >= width - border_width { + buf.append(&mut vec![255u8; 3]); + } else { + buf.append(&mut vec![0u8; 3]); + } + } + } + + // Create a custom glyph with the rectangle data attached to it + return Ok(RasterizedGlyph { + c: BOX_CURSOR_CHAR, + top: ascent, + left: 0, + height, + width, + buf: buf, + }); +} + struct BufDebugger<'a>(&'a [u8]); impl<'a> fmt::Debug for BufDebugger<'a> { |