aboutsummaryrefslogtreecommitdiffstats
path: root/components/gfx/platform/windows/font.rs
diff options
context:
space:
mode:
authorMartin Robinson <mrobinson@igalia.com>2024-03-14 12:31:00 +0100
committerGitHub <noreply@github.com>2024-03-14 11:31:00 +0000
commite5fbb3d48781765745f5fcc007e469f048e9ebd7 (patch)
treefaba212ef3539d632e1c1a989a1c10cfc8ff4beb /components/gfx/platform/windows/font.rs
parentb1debf20689949c0acfb06efca70f7fd34dc0854 (diff)
downloadservo-e5fbb3d48781765745f5fcc007e469f048e9ebd7.tar.gz
servo-e5fbb3d48781765745f5fcc007e469f048e9ebd7.zip
fonts: Add `FontIdentifier` and `LocalFontIdentifier` (#31658)
Instead of using a simple `Atom` to identify a local font, use a data structure. This allows us to carry more information necessary to identify a local font (such as a path on MacOS). We need this for the new version of WebRender, as fonts on MacOS now require a path. This has a lot of benefits: 1. We can avoid loading fonts without paths on MacOS, which should avoid a lot of problems with flakiness and ensure we always load the same font for a given identifier. 2. This clarifies the difference between web fonts and local fonts, though there is more work to do here. 3. This avoid a *lot* of font shenanigans, such as trying to work backwards from the name of the font to the path of the font we actually matched. In general, we can remove a lot of code trying to accomplish these shenanigans. 4. Getting the font bytes always returns an `Arc` now avoiding an extra full font copy in the case of Canvas.
Diffstat (limited to 'components/gfx/platform/windows/font.rs')
-rw-r--r--components/gfx/platform/windows/font.rs42
1 files changed, 16 insertions, 26 deletions
diff --git a/components/gfx/platform/windows/font.rs b/components/gfx/platform/windows/font.rs
index 4e57d00c187..8b05eb3cf07 100644
--- a/components/gfx/platform/windows/font.rs
+++ b/components/gfx/platform/windows/font.rs
@@ -13,7 +13,6 @@ use std::sync::Arc;
use app_units::Au;
use dwrote::{Font, FontFace, FontFile, FontStretch, FontStyle};
use log::debug;
-use servo_atoms::Atom;
use style::computed_values::font_stretch::T as StyleFontStretch;
use style::computed_values::font_weight::T as StyleFontWeight;
use style::values::computed::font::FontStyle as StyleFontStyle;
@@ -22,9 +21,9 @@ use style::values::specified::font::FontStretchKeyword;
use crate::font::{
FontHandleMethods, FontMetrics, FontTableMethods, FontTableTag, FractionalPixel,
};
+use crate::font_cache_thread::FontIdentifier;
use crate::platform::font_template::FontTemplateData;
use crate::platform::windows::font_context::FontContextHandle;
-use crate::platform::windows::font_list::font_from_atom;
use crate::text::glyph::GlyphId;
// 1em = 12pt = 16px, assuming 72 points per inch and 96 px per inch
@@ -208,7 +207,6 @@ pub struct FontHandle {
face: Nondebug<FontFace>,
info: FontInfo,
em_size: f32,
- du_per_em: f32,
du_to_px: f32,
scaled_du_to_px: f32,
}
@@ -236,24 +234,17 @@ impl FontHandleMethods for FontHandle {
template: Arc<FontTemplateData>,
pt_size: Option<Au>,
) -> Result<Self, ()> {
- let (info, face) = if let Some(ref raw_font) = template.bytes {
- let font_file = FontFile::new_from_data(Arc::new(raw_font.clone()));
- if font_file.is_none() {
- // failed to load raw font
- return Err(());
- }
-
- let face = font_file
- .unwrap()
- .create_face(0, dwrote::DWRITE_FONT_SIMULATIONS_NONE)
- .map_err(|_| ())?;
- let info = FontInfo::new_from_face(&face)?;
- (info, face)
- } else {
- let font = font_from_atom(&template.identifier);
- let face = font.create_font_face();
- let info = FontInfo::new_from_font(&font)?;
- (info, face)
+ let (face, info) = match template.get_font() {
+ Some(font) => (font.create_font_face(), FontInfo::new_from_font(&font)?),
+ None => {
+ let bytes = template.bytes();
+ let font_file = FontFile::new_from_data(bytes).ok_or(())?;
+ let face = font_file
+ .create_face(0, dwrote::DWRITE_FONT_SIMULATIONS_NONE)
+ .map_err(|_| ())?;
+ let info = FontInfo::new_from_face(&face)?;
+ (face, info)
+ },
};
let pt_size = pt_size.unwrap_or(au_from_pt(12.));
@@ -268,9 +259,8 @@ impl FontHandleMethods for FontHandle {
Ok(FontHandle {
font_data: template.clone(),
face: Nondebug(face),
- info: info,
- em_size: em_size,
- du_per_em: du_per_em,
+ info,
+ em_size,
du_to_px: design_units_to_pixels,
scaled_du_to_px: scaled_design_units_to_pixels,
})
@@ -366,7 +356,7 @@ impl FontHandleMethods for FontHandle {
.map(|bytes| FontTable { data: bytes })
}
- fn identifier(&self) -> Atom {
- self.font_data.identifier.clone()
+ fn identifier(&self) -> &FontIdentifier {
+ &self.font_data.identifier
}
}