mirror of
https://github.com/alacritty/alacritty.git
synced 2024-11-11 13:51:01 -05:00
Set default FreeType properties
In addition it also starts respecting Fontconfig's `autohint` and `hinting` options. Fixes #3534.
This commit is contained in:
parent
44f25493ca
commit
b78f3d1339
2 changed files with 35 additions and 14 deletions
|
@ -65,6 +65,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
- Preservation of the alternate screen's saved cursor when swapping to primary screen and back
|
- Preservation of the alternate screen's saved cursor when swapping to primary screen and back
|
||||||
- Reflow of cursor during resize
|
- Reflow of cursor during resize
|
||||||
- Cursor color escape ignored when its color is set to inverted in the config
|
- Cursor color escape ignored when its color is set to inverted in the config
|
||||||
|
- Fontconfig's `autohint` and `hinting` options being ignored
|
||||||
|
- Ingoring of default FreeType properties
|
||||||
|
|
||||||
## 0.4.3
|
## 0.4.3
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@ use std::collections::HashMap;
|
||||||
use std::fmt::{self, Display, Formatter};
|
use std::fmt::{self, Display, Formatter};
|
||||||
use std::rc::Rc;
|
use std::rc::Rc;
|
||||||
|
|
||||||
|
use freetype::face::LoadFlag;
|
||||||
use freetype::tt_os2::TrueTypeOS2Table;
|
use freetype::tt_os2::TrueTypeOS2Table;
|
||||||
use freetype::{self, Library, Matrix};
|
use freetype::{self, Library, Matrix};
|
||||||
use freetype::{freetype_sys, Face as FTFace};
|
use freetype::{freetype_sys, Face as FTFace};
|
||||||
|
@ -45,7 +46,7 @@ struct FallbackList {
|
||||||
}
|
}
|
||||||
|
|
||||||
struct FaceLoadingProperties {
|
struct FaceLoadingProperties {
|
||||||
load_flags: freetype::face::LoadFlag,
|
load_flags: LoadFlag,
|
||||||
render_mode: freetype::RenderMode,
|
render_mode: freetype::RenderMode,
|
||||||
lcd_filter: c_uint,
|
lcd_filter: c_uint,
|
||||||
non_scalable: Option<f32>,
|
non_scalable: Option<f32>,
|
||||||
|
@ -99,6 +100,11 @@ impl Rasterize for FreeTypeRasterizer {
|
||||||
fn new(device_pixel_ratio: f32, _: bool) -> Result<FreeTypeRasterizer, Error> {
|
fn new(device_pixel_ratio: f32, _: bool) -> Result<FreeTypeRasterizer, Error> {
|
||||||
let library = Library::init()?;
|
let library = Library::init()?;
|
||||||
|
|
||||||
|
unsafe {
|
||||||
|
// Initialize default properties, like user preferred interpreter.
|
||||||
|
freetype_sys::FT_Set_Default_Properties(library.raw());
|
||||||
|
};
|
||||||
|
|
||||||
Ok(FreeTypeRasterizer {
|
Ok(FreeTypeRasterizer {
|
||||||
faces: HashMap::new(),
|
faces: HashMap::new(),
|
||||||
ft_faces: HashMap::new(),
|
ft_faces: HashMap::new(),
|
||||||
|
@ -484,19 +490,26 @@ impl FreeTypeRasterizer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn ft_load_flags(pattern: &PatternRef) -> freetype::face::LoadFlag {
|
fn ft_load_flags(pattern: &PatternRef) -> LoadFlag {
|
||||||
let antialias = pattern.antialias().next().unwrap_or(true);
|
let antialias = pattern.antialias().next().unwrap_or(true);
|
||||||
let hinting = pattern.hintstyle().next().unwrap_or(fc::HintStyle::Slight);
|
let autohint = pattern.autohint().next().unwrap_or(false);
|
||||||
|
let hinting = pattern.hinting().next().unwrap_or(true);
|
||||||
let rgba = pattern.rgba().next().unwrap_or(fc::Rgba::Unknown);
|
let rgba = pattern.rgba().next().unwrap_or(fc::Rgba::Unknown);
|
||||||
let embedded_bitmaps = pattern.embeddedbitmap().next().unwrap_or(true);
|
let embedded_bitmaps = pattern.embeddedbitmap().next().unwrap_or(true);
|
||||||
let scalable = pattern.scalable().next().unwrap_or(true);
|
let scalable = pattern.scalable().next().unwrap_or(true);
|
||||||
let color = pattern.color().next().unwrap_or(false);
|
let color = pattern.color().next().unwrap_or(false);
|
||||||
|
|
||||||
use freetype::face::LoadFlag;
|
// Disable hinting if so was requested.
|
||||||
let mut flags = match (antialias, hinting, rgba) {
|
let hintstyle = if hinting {
|
||||||
|
pattern.hintstyle().next().unwrap_or(fc::HintStyle::Full)
|
||||||
|
} else {
|
||||||
|
fc::HintStyle::None
|
||||||
|
};
|
||||||
|
|
||||||
|
let mut flags = match (antialias, hintstyle, rgba) {
|
||||||
(false, fc::HintStyle::None, _) => LoadFlag::NO_HINTING | LoadFlag::MONOCHROME,
|
(false, fc::HintStyle::None, _) => LoadFlag::NO_HINTING | LoadFlag::MONOCHROME,
|
||||||
(false, ..) => LoadFlag::TARGET_MONO | LoadFlag::MONOCHROME,
|
(false, ..) => LoadFlag::TARGET_MONO | LoadFlag::MONOCHROME,
|
||||||
(true, fc::HintStyle::None, _) => LoadFlag::NO_HINTING | LoadFlag::TARGET_NORMAL,
|
(true, fc::HintStyle::None, _) => LoadFlag::NO_HINTING,
|
||||||
// `hintslight` does *not* use LCD hinting even when a subpixel mode
|
// `hintslight` does *not* use LCD hinting even when a subpixel mode
|
||||||
// is selected.
|
// is selected.
|
||||||
//
|
//
|
||||||
|
@ -512,16 +525,16 @@ impl FreeTypeRasterizer {
|
||||||
// cairo take the same approach and consider `hintslight` to always
|
// cairo take the same approach and consider `hintslight` to always
|
||||||
// prefer `FT_LOAD_TARGET_LIGHT`.
|
// prefer `FT_LOAD_TARGET_LIGHT`.
|
||||||
(true, fc::HintStyle::Slight, _) => LoadFlag::TARGET_LIGHT,
|
(true, fc::HintStyle::Slight, _) => LoadFlag::TARGET_LIGHT,
|
||||||
|
(true, fc::HintStyle::Medium, _) => LoadFlag::TARGET_NORMAL,
|
||||||
// If LCD hinting is to be used, must select hintmedium or hintfull,
|
// If LCD hinting is to be used, must select hintmedium or hintfull,
|
||||||
// have AA enabled, and select a subpixel mode.
|
// have AA enabled, and select a subpixel mode.
|
||||||
(true, _, fc::Rgba::Rgb) | (true, _, fc::Rgba::Bgr) => LoadFlag::TARGET_LCD,
|
(true, fc::HintStyle::Full, fc::Rgba::Rgb)
|
||||||
(true, _, fc::Rgba::Vrgb) | (true, _, fc::Rgba::Vbgr) => LoadFlag::TARGET_LCD_V,
|
| (true, fc::HintStyle::Full, fc::Rgba::Bgr) => LoadFlag::TARGET_LCD,
|
||||||
// For non-rgba modes with either Medium or Full hinting, just use
|
(true, fc::HintStyle::Full, fc::Rgba::Vrgb)
|
||||||
// the default hinting algorithm.
|
| (true, fc::HintStyle::Full, fc::Rgba::Vbgr) => LoadFlag::TARGET_LCD_V,
|
||||||
//
|
// For non-rgba modes with Full hinting, just use the default hinting algorithm.
|
||||||
// TODO should Medium/Full control whether to use the auto hinter?
|
(true, fc::HintStyle::Full, fc::Rgba::Unknown)
|
||||||
(true, _, fc::Rgba::Unknown) => LoadFlag::TARGET_NORMAL,
|
| (true, fc::HintStyle::Full, fc::Rgba::None) => LoadFlag::TARGET_NORMAL,
|
||||||
(true, _, fc::Rgba::None) => LoadFlag::TARGET_NORMAL,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// Non scalable fonts only have bitmaps, so disabling them entirely is likely not a
|
// Non scalable fonts only have bitmaps, so disabling them entirely is likely not a
|
||||||
|
@ -530,10 +543,16 @@ impl FreeTypeRasterizer {
|
||||||
flags |= LoadFlag::NO_BITMAP;
|
flags |= LoadFlag::NO_BITMAP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Use color for colored fonts.
|
||||||
if color {
|
if color {
|
||||||
flags |= LoadFlag::COLOR;
|
flags |= LoadFlag::COLOR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Force autohint if it was requested.
|
||||||
|
if autohint {
|
||||||
|
flags |= LoadFlag::FORCE_AUTOHINT;
|
||||||
|
}
|
||||||
|
|
||||||
flags
|
flags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue