1
0
Fork 0
mirror of https://github.com/alacritty/alacritty.git synced 2024-11-25 14:05:41 -05:00

Add glyph offset option to user configuration

Add the ability to move glyphs within their cells on a global basis via
an option in the configuration file.
This commit is contained in:
Aaron Williamson 2017-01-15 10:38:04 -07:00 committed by Joe Wilm
parent 1277e07671
commit 0a1dc56bcf
4 changed files with 66 additions and 5 deletions

View file

@ -54,12 +54,20 @@ font:
# Point size of the font # Point size of the font
size: 11.0 size: 11.0
# Offset is the extra space around each character. offset.y can be thought of # Offset is the extra space around each character. offset.y can be thought of
# as modifying the linespacing, and offset.x as modifying the letter spacing. # as modifying the linespacing, and offset.x as modifying the letter spacing.
offset: offset:
x: 0.0 x: 0.0
y: 0.0 y: 0.0
# Glyph offset determines the locations of the glyphs within their cells with
# the default being at the bottom. Increase the x offset to move the glyph to
# the right, increase the y offset to move the glyph upward.
glyph_offset:
x: 0.0
y: 0.0
# OS X only: use thin stroke font rendering. Thin strokes are suitable # OS X only: use thin stroke font rendering. Thin strokes are suitable
# for retina displays, but for non-retina you probably want this set to # for retina displays, but for non-retina you probably want this set to
# false. # false.

View file

@ -53,12 +53,20 @@ font:
# Point size of the font # Point size of the font
size: 12.0 size: 12.0
# Offset is the extra space around each character. offset.y can be thought of # Offset is the extra space around each character. offset.y can be thought of
# as modifying the linespacing, and offset.x as modifying the letter spacing. # as modifying the linespacing, and offset.x as modifying the letter spacing.
offset: offset:
x: 0.0 x: 0.0
y: 0.0 y: 0.0
# Glyph offset determines the locations of the glyphs within their cells with
# the default being at the bottom. Increase the x offset to move the glyph to
# the right, increase the y offset to move the glyph upward.
glyph_offset:
x: 0.0
y: 0.0
# OS X only: use thin stroke font rendering. Thin strokes are suitable # OS X only: use thin stroke font rendering. Thin strokes are suitable
# for retina displays, but for non-retina you probably want this set to # for retina displays, but for non-retina you probably want this set to
# false. # false.

View file

@ -1195,6 +1195,25 @@ impl Default for FontOffset {
} }
} }
/// Modifications to glyph positions within their cells
///
/// By default the glyphs are located at the bottom of the cell which can be
/// undesirable. This gives the user a way to shift where the glyphs are
/// displayed in their cells.
#[derive(Clone, Copy, Debug, Deserialize)]
pub struct GlyphOffset {
/// Horizontal position
pub x: f32,
/// Vertical position
pub y: f32,
}
impl Default for GlyphOffset {
fn default() -> GlyphOffset {
GlyphOffset { x: 0.0, y: 0.0 }
}
}
trait DeserializeFromF32 : Sized { trait DeserializeFromF32 : Sized {
fn deserialize_from_f32<D>(D) -> ::std::result::Result<Self, D::Error> fn deserialize_from_f32<D>(D) -> ::std::result::Result<Self, D::Error>
where D: serde::de::Deserializer; where D: serde::de::Deserializer;
@ -1256,6 +1275,10 @@ pub struct Font {
/// Extra spacing per character /// Extra spacing per character
offset: FontOffset, offset: FontOffset,
/// Glyph offset within character cell
#[serde(default)]
glyph_offset: GlyphOffset,
#[serde(default="true_bool")] #[serde(default="true_bool")]
use_thin_strokes: bool use_thin_strokes: bool
} }
@ -1296,6 +1319,12 @@ impl Font {
pub fn offset(&self) -> &FontOffset { pub fn offset(&self) -> &FontOffset {
&self.offset &self.offset
} }
/// Get cell offsets for glyphs
#[inline]
pub fn glyph_offset(&self) -> &GlyphOffset {
&self.glyph_offset
}
} }
#[cfg(target_os = "macos")] #[cfg(target_os = "macos")]
@ -1307,7 +1336,8 @@ impl Default for Font {
italic: FontDescription::new_with_family("Menlo"), italic: FontDescription::new_with_family("Menlo"),
size: Size::new(11.0), size: Size::new(11.0),
use_thin_strokes: true, use_thin_strokes: true,
offset: Default::default() offset: Default::default(),
glyph_offset: Default::default()
} }
} }
} }
@ -1321,7 +1351,8 @@ impl Default for Font {
italic: FontDescription::new_with_family("monospace"), italic: FontDescription::new_with_family("monospace"),
size: Size::new(11.0), size: Size::new(11.0),
use_thin_strokes: false, use_thin_strokes: false,
offset: Default::default() offset: Default::default(),
glyph_offset: Default::default()
} }
} }
} }

View file

@ -28,7 +28,7 @@ use gl;
use index::{Line, Column, RangeInclusive}; use index::{Line, Column, RangeInclusive};
use notify::{Watcher as WatcherApi, RecommendedWatcher as Watcher, op}; use notify::{Watcher as WatcherApi, RecommendedWatcher as Watcher, op};
use config::Config; use config::{Config, GlyphOffset};
use term::{self, cell, RenderableCell}; use term::{self, cell, RenderableCell};
use window::{Size, Pixels}; use window::{Size, Pixels};
@ -154,6 +154,9 @@ pub struct GlyphCache {
/// font size /// font size
font_size: font::Size, font_size: font::Size,
/// glyph offset
glyph_offset: GlyphOffset,
} }
impl GlyphCache { impl GlyphCache {
@ -166,6 +169,7 @@ impl GlyphCache {
{ {
let font = config.font(); let font = config.font();
let size = font.size(); let size = font.size();
let glyph_offset = *font.glyph_offset();
// Load regular font // Load regular font
let regular_desc = if let Some(ref style) = font.normal.style { let regular_desc = if let Some(ref style) = font.normal.style {
@ -223,6 +227,7 @@ impl GlyphCache {
font_key: regular, font_key: regular,
bold_key: bold, bold_key: bold,
italic_key: italic, italic_key: italic,
glyph_offset: glyph_offset,
}; };
macro_rules! load_glyphs_for_font { macro_rules! load_glyphs_for_font {
@ -253,9 +258,12 @@ impl GlyphCache {
fn load_and_cache_glyph<L>(&mut self, glyph_key: GlyphKey, loader: &mut L) fn load_and_cache_glyph<L>(&mut self, glyph_key: GlyphKey, loader: &mut L)
where L: LoadGlyph where L: LoadGlyph
{ {
let rasterized = self.rasterizer.get_glyph(&glyph_key) let mut rasterized = self.rasterizer.get_glyph(&glyph_key)
.unwrap_or_else(|_| Default::default()); .unwrap_or_else(|_| Default::default());
rasterized.left += self.glyph_offset.x as i32;
rasterized.top += self.glyph_offset.y as i32;
let glyph = loader.load_glyph(&rasterized); let glyph = loader.load_glyph(&rasterized);
self.cache.insert(glyph_key, glyph); self.cache.insert(glyph_key, glyph);
} }
@ -263,12 +271,18 @@ impl GlyphCache {
pub fn get<'a, L>(&'a mut self, glyph_key: &GlyphKey, loader: &mut L) -> &'a Glyph pub fn get<'a, L>(&'a mut self, glyph_key: &GlyphKey, loader: &mut L) -> &'a Glyph
where L: LoadGlyph where L: LoadGlyph
{ {
let glyph_offset = self.glyph_offset;
let rasterizer = &mut self.rasterizer; let rasterizer = &mut self.rasterizer;
self.cache self.cache
.entry(*glyph_key) .entry(*glyph_key)
.or_insert_with(|| { .or_insert_with(|| {
let rasterized = rasterizer.get_glyph(&glyph_key) let mut rasterized = rasterizer.get_glyph(&glyph_key)
.unwrap_or_else(|_| Default::default()); .unwrap_or_else(|_| Default::default());
// We need to apply the offset to glyphs that didn't get cached initially
rasterized.left += glyph_offset.x as i32;
rasterized.top += glyph_offset.y as i32;
loader.load_glyph(&rasterized) loader.load_glyph(&rasterized)
}) })
} }