From 9461760518fb0307b50d71c68f5088a46220320d Mon Sep 17 00:00:00 2001 From: Kirill Chibisov Date: Tue, 20 Feb 2024 02:34:06 +0400 Subject: [PATCH] Use yeslogic-fontconfig-sys instead of servo The servo crate is not maintained anymore. This also bumps freetype-rs along the way, since it had circular dependency. --- Cargo.toml | 7 ++----- src/ft/fc/mod.rs | 10 +++++----- src/ft/mod.rs | 15 ++++++--------- 3 files changed, 13 insertions(+), 19 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 61d40bf..be80d3e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,8 +18,8 @@ foreign-types = "0.5" log = "0.4" [target.'cfg(not(any(target_os = "macos", windows)))'.dependencies] -servo-fontconfig = "0.5.1" -freetype-rs = "0.26" +yeslogic-fontconfig-sys = "5.0.0" +freetype-rs = "0.36.0" [target.'cfg(not(any(target_os = "macos", windows)))'.build-dependencies] pkg-config = "0.3" @@ -36,6 +36,3 @@ once_cell = "1.12" [target.'cfg(windows)'.dependencies] dwrote = { version = "0.11" } winapi = { version = "0.3", features = ["impl-default"] } - -[features] -force_system_fontconfig = ["servo-fontconfig/force_system_lib"] diff --git a/src/ft/fc/mod.rs b/src/ft/fc/mod.rs index 824966d..b5f33ac 100644 --- a/src/ft/fc/mod.rs +++ b/src/ft/fc/mod.rs @@ -3,17 +3,17 @@ use std::ptr; use foreign_types::{ForeignType, ForeignTypeRef}; -use fontconfig::fontconfig as ffi; +use fontconfig_sys as ffi; +use ffi::constants::{FC_SLANT_ITALIC, FC_SLANT_OBLIQUE, FC_SLANT_ROMAN}; +use ffi::constants::{FC_WEIGHT_BLACK, FC_WEIGHT_BOLD, FC_WEIGHT_EXTRABLACK, FC_WEIGHT_EXTRABOLD}; +use ffi::constants::{FC_WEIGHT_BOOK, FC_WEIGHT_MEDIUM, FC_WEIGHT_REGULAR, FC_WEIGHT_SEMIBOLD}; +use ffi::constants::{FC_WEIGHT_EXTRALIGHT, FC_WEIGHT_LIGHT, FC_WEIGHT_THIN}; use ffi::FcInitBringUptoDate; use ffi::FcResultNoMatch; use ffi::{FcFontList, FcFontMatch, FcFontSort}; use ffi::{FcMatchFont, FcMatchPattern, FcMatchScan}; use ffi::{FcSetApplication, FcSetSystem}; -use ffi::{FC_SLANT_ITALIC, FC_SLANT_OBLIQUE, FC_SLANT_ROMAN}; -use ffi::{FC_WEIGHT_BLACK, FC_WEIGHT_BOLD, FC_WEIGHT_EXTRABLACK, FC_WEIGHT_EXTRABOLD}; -use ffi::{FC_WEIGHT_BOOK, FC_WEIGHT_MEDIUM, FC_WEIGHT_REGULAR, FC_WEIGHT_SEMIBOLD}; -use ffi::{FC_WEIGHT_EXTRALIGHT, FC_WEIGHT_LIGHT, FC_WEIGHT_THIN}; pub mod config; pub use config::{Config, ConfigRef}; diff --git a/src/ft/mod.rs b/src/ft/mod.rs index c675098..1274e10 100644 --- a/src/ft/mod.rs +++ b/src/ft/mod.rs @@ -78,6 +78,7 @@ impl fmt::Debug for FaceLoadingProperties { freetype::RenderMode::Lcd => "Lcd", freetype::RenderMode::LcdV => "LcdV", freetype::RenderMode::Max => "Max", + freetype::RenderMode::Sdf => "Sdf", }) .field("lcd_filter", &self.lcd_filter) .finish() @@ -201,7 +202,7 @@ impl Rasterize for FreeTypeRasterizer { fn get_glyph(&mut self, glyph_key: GlyphKey) -> Result { let font_key = self.face_for_glyph(glyph_key); let face = &self.loader.faces[&font_key]; - let index = face.ft_face.get_char_index(glyph_key.character as usize); + let index = face.ft_face.get_char_index(glyph_key.character as usize).unwrap_or_default(); let pixelsize = face.non_scalable.unwrap_or_else(|| glyph_key.size.as_px()); if !face.colored_bitmap { @@ -292,8 +293,8 @@ impl Rasterize for FreeTypeRasterizer { return (0., 0.); } - let left = ft_face.get_char_index(left.character as usize); - let right = ft_face.get_char_index(right.character as usize); + let left = ft_face.get_char_index(left.character as usize).unwrap_or_default(); + let right = ft_face.get_char_index(right.character as usize).unwrap_or_default(); let mut kerning = freetype_sys::FT_Vector::default(); let mode = freetype_sys::FT_KERNING_DEFAULT; @@ -423,9 +424,7 @@ impl FreeTypeRasterizer { fn face_for_glyph(&mut self, glyph_key: GlyphKey) -> FontKey { if let Some(face) = self.loader.faces.get(&glyph_key.font_key) { - let index = face.ft_face.get_char_index(glyph_key.character as usize); - - if index != 0 { + if face.ft_face.get_char_index(glyph_key.character as usize).is_some() { return glyph_key.font_key; } } @@ -446,10 +445,8 @@ impl FreeTypeRasterizer { let font_pattern = &fallback_font.pattern; match self.loader.faces.get(&font_key) { Some(face) => { - let index = face.ft_face.get_char_index(glyph.character as usize); - // We found something in a current face, so let's use it. - if index != 0 { + if face.ft_face.get_char_index(glyph.character as usize).is_some() { return Ok(font_key); } },