aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout_thread_2020/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout_thread_2020/lib.rs')
-rw-r--r--components/layout_thread_2020/lib.rs126
1 files changed, 64 insertions, 62 deletions
diff --git a/components/layout_thread_2020/lib.rs b/components/layout_thread_2020/lib.rs
index d0a9eccfef9..c23e6f55fd4 100644
--- a/components/layout_thread_2020/lib.rs
+++ b/components/layout_thread_2020/lib.rs
@@ -22,7 +22,7 @@ use euclid::{Point2D, Scale, Size2D, Vector2D};
use fnv::FnvHashMap;
use fxhash::FxHashMap;
use gfx::font_cache_thread::FontCacheThread;
-use gfx::font_context;
+use gfx::font_context::FontContext;
use gfx_traits::{node_id_from_scroll_id, Epoch};
use ipc_channel::ipc::{self, IpcSender};
use ipc_channel::router::ROUTER;
@@ -41,7 +41,7 @@ use malloc_size_of::{MallocSizeOf, MallocSizeOfOps};
use metrics::{PaintTimeMetrics, ProfilerMetadataFactory};
use msg::constellation_msg::{BrowsingContextId, PipelineId};
use net_traits::image_cache::{ImageCache, UsePlaceholder};
-use parking_lot::{ReentrantMutex, RwLock};
+use parking_lot::RwLock;
use profile_traits::mem::{Report, ReportKind};
use profile_traits::path;
use profile_traits::time::{
@@ -121,7 +121,10 @@ pub struct LayoutThread {
/// Public interface to the font cache thread. This needs to be behind a [`ReentrantMutex`],
/// because some font cache operations can trigger others.
- font_cache_thread: Arc<ReentrantMutex<FontCacheThread>>,
+ font_cache_thread: FontCacheThread,
+
+ /// A FontContext to be used during layout.
+ font_context: Arc<FontContext<FontCacheThread>>,
/// Is this the first reflow in this LayoutThread?
first_reflow: Cell<bool>,
@@ -484,13 +487,13 @@ impl LayoutThread {
// The device pixel ratio is incorrect (it does not have the hidpi value),
// but it will be set correctly when the initial reflow takes place.
- let font_cache_thread = Arc::new(ReentrantMutex::new(font_cache_thread));
+ let font_context = Arc::new(FontContext::new(font_cache_thread.clone()));
let device = Device::new(
MediaType::screen(),
QuirksMode::NoQuirks,
window_size.initial_viewport,
window_size.device_pixel_ratio,
- Box::new(LayoutFontMetricsProvider(font_cache_thread.clone())),
+ Box::new(LayoutFontMetricsProvider(font_context.clone())),
);
// Ask the router to proxy IPC messages from the font cache thread to layout.
@@ -514,6 +517,7 @@ impl LayoutThread {
registered_painters: RegisteredPaintersImpl(Default::default()),
image_cache,
font_cache_thread,
+ font_context,
first_reflow: Cell::new(true),
font_cache_sender: ipc_font_cache_sender,
generation: Cell::new(0),
@@ -584,7 +588,7 @@ impl LayoutThread {
traversal_flags,
),
image_cache: self.image_cache.clone(),
- font_cache_thread: self.font_cache_thread.clone(),
+ font_context: self.font_context.clone(),
webrender_image_cache: self.webrender_image_cache.clone(),
pending_images: Mutex::new(vec![]),
use_rayon,
@@ -616,10 +620,8 @@ impl LayoutThread {
// Find all font-face rules and notify the font cache of them.
// GWTODO: Need to handle unloading web fonts.
if stylesheet.is_effective_for_device(self.stylist.device(), guard) {
- let newly_loading_font_count = self
- .font_cache_thread
- .lock()
- .add_all_web_fonts_from_stylesheet(
+ let newly_loading_font_count =
+ self.font_cache_thread.add_all_web_fonts_from_stylesheet(
stylesheet,
guard,
self.stylist.device(),
@@ -637,7 +639,7 @@ impl LayoutThread {
}
fn handle_web_font_loaded(&self) {
- font_context::invalidate_font_caches();
+ self.font_context.invalidate_caches();
self.script_chan
.send(ConstellationControlMsg::WebFontLoaded(self.id))
.unwrap();
@@ -1076,7 +1078,7 @@ impl LayoutThread {
self.stylist.quirks_mode(),
window_size_data.initial_viewport,
window_size_data.device_pixel_ratio,
- Box::new(LayoutFontMetricsProvider(self.font_cache_thread.clone())),
+ Box::new(LayoutFontMetricsProvider(self.font_context.clone())),
);
// Preserve any previously computed root font size.
@@ -1235,7 +1237,7 @@ impl RegisteredSpeculativePainters for RegisteredPaintersImpl {
}
#[derive(Debug)]
-struct LayoutFontMetricsProvider(Arc<ReentrantMutex<FontCacheThread>>);
+struct LayoutFontMetricsProvider(Arc<FontContext<FontCacheThread>>);
impl FontMetricsProvider for LayoutFontMetricsProvider {
fn query_font_metrics(
@@ -1246,55 +1248,55 @@ impl FontMetricsProvider for LayoutFontMetricsProvider {
_in_media_query: bool,
_retrieve_math_scales: bool,
) -> FontMetrics {
- layout::context::with_thread_local_font_context(&self.0, move |font_context| {
- let font_group =
- font_context.font_group_with_size(ServoArc::new(font.clone()), base_size.into());
- let Some(first_font_metrics) = font_group
- .borrow_mut()
- .first(font_context)
- .map(|font| font.borrow().metrics.clone())
- else {
- return Default::default();
- };
+ let font_context = &self.0;
+ let font_group = self
+ .0
+ .font_group_with_size(ServoArc::new(font.clone()), base_size.into());
+
+ let Some(first_font_metrics) = font_group
+ .write()
+ .first(font_context)
+ .map(|font| font.metrics.clone())
+ else {
+ return Default::default();
+ };
- // Only use the x-height of this font if it is non-zero. Some fonts return
- // inaccurate metrics, which shouldn't be used.
- let x_height = Some(first_font_metrics.x_height)
- .filter(|x_height| !x_height.is_zero())
- .map(CSSPixelLength::from);
-
- let zero_advance_measure = first_font_metrics
- .zero_horizontal_advance
- .or_else(|| {
- font_group
- .borrow_mut()
- .find_by_codepoint(font_context, '0')?
- .borrow()
- .metrics
- .zero_horizontal_advance
- })
- .map(CSSPixelLength::from);
- let ic_width = first_font_metrics
- .ic_horizontal_advance
- .or_else(|| {
- font_group
- .borrow_mut()
- .find_by_codepoint(font_context, '\u{6C34}')?
- .borrow()
- .metrics
- .ic_horizontal_advance
- })
- .map(CSSPixelLength::from);
-
- FontMetrics {
- x_height,
- zero_advance_measure,
- cap_height: None,
- ic_width,
- ascent: first_font_metrics.ascent.into(),
- script_percent_scale_down: None,
- script_script_percent_scale_down: None,
- }
- })
+ // Only use the x-height of this font if it is non-zero. Some fonts return
+ // inaccurate metrics, which shouldn't be used.
+ let x_height = Some(first_font_metrics.x_height)
+ .filter(|x_height| !x_height.is_zero())
+ .map(CSSPixelLength::from);
+
+ let zero_advance_measure = first_font_metrics
+ .zero_horizontal_advance
+ .or_else(|| {
+ font_group
+ .write()
+ .find_by_codepoint(font_context, '0')?
+ .metrics
+ .zero_horizontal_advance
+ })
+ .map(CSSPixelLength::from);
+
+ let ic_width = first_font_metrics
+ .ic_horizontal_advance
+ .or_else(|| {
+ font_group
+ .write()
+ .find_by_codepoint(font_context, '\u{6C34}')?
+ .metrics
+ .ic_horizontal_advance
+ })
+ .map(CSSPixelLength::from);
+
+ FontMetrics {
+ x_height,
+ zero_advance_measure,
+ cap_height: None,
+ ic_width,
+ ascent: first_font_metrics.ascent.into(),
+ script_percent_scale_down: None,
+ script_script_percent_scale_down: None,
+ }
}
}