mirror of
https://github.com/servo/servo.git
synced 2025-07-13 18:33:40 +01:00
As a follow-up, we could move all the data living under a mutex in the SharedLayoutContext only in order to create the local context to the same place. This should increase animation performance when there are multiple animations in one page that happen to be on different threads.
93 lines
3.5 KiB
Rust
93 lines
3.5 KiB
Rust
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
//! The context within which style is calculated.
|
|
|
|
use animation::Animation;
|
|
use app_units::Au;
|
|
use dom::OpaqueNode;
|
|
use error_reporting::ParseErrorReporter;
|
|
use euclid::Size2D;
|
|
use matching::{ApplicableDeclarationsCache, StyleSharingCandidateCache};
|
|
use selector_impl::SelectorImplExt;
|
|
use selector_matching::Stylist;
|
|
use std::cell::RefCell;
|
|
use std::collections::HashMap;
|
|
use std::sync::mpsc::Sender;
|
|
use std::sync::{Arc, Mutex, RwLock};
|
|
|
|
/// This structure is used to create a local style context from a shared one.
|
|
pub struct LocalStyleContextCreationInfo<Impl: SelectorImplExt> {
|
|
new_animations_sender: Sender<Animation<Impl>>,
|
|
}
|
|
|
|
impl<Impl: SelectorImplExt> LocalStyleContextCreationInfo<Impl> {
|
|
pub fn new(animations_sender: Sender<Animation<Impl>>) -> Self {
|
|
LocalStyleContextCreationInfo {
|
|
new_animations_sender: animations_sender,
|
|
}
|
|
}
|
|
}
|
|
|
|
pub struct SharedStyleContext<Impl: SelectorImplExt> {
|
|
/// The current viewport size.
|
|
pub viewport_size: Size2D<Au>,
|
|
|
|
/// Screen sized changed?
|
|
pub screen_size_changed: bool,
|
|
|
|
/// The CSS selector stylist.
|
|
pub stylist: Arc<Stylist<Impl>>,
|
|
|
|
/// Starts at zero, and increased by one every time a layout completes.
|
|
/// This can be used to easily check for invalid stale data.
|
|
pub generation: u32,
|
|
|
|
/// Why is this reflow occurring
|
|
pub goal: ReflowGoal,
|
|
|
|
/// The animations that are currently running.
|
|
pub running_animations: Arc<RwLock<HashMap<OpaqueNode, Vec<Animation<Impl>>>>>,
|
|
|
|
/// The list of animations that have expired since the last style recalculation.
|
|
pub expired_animations: Arc<RwLock<HashMap<OpaqueNode, Vec<Animation<Impl>>>>>,
|
|
|
|
///The CSS error reporter for all CSS loaded in this layout thread
|
|
pub error_reporter: Box<ParseErrorReporter + Sync>,
|
|
|
|
/// Data needed to create the local style context from the shared one.
|
|
pub local_context_creation_data: Mutex<LocalStyleContextCreationInfo<Impl>>,
|
|
}
|
|
|
|
pub struct LocalStyleContext<Impl: SelectorImplExt> {
|
|
pub applicable_declarations_cache: RefCell<ApplicableDeclarationsCache<Impl::ComputedValues>>,
|
|
pub style_sharing_candidate_cache: RefCell<StyleSharingCandidateCache<Impl::ComputedValues>>,
|
|
/// A channel on which new animations that have been triggered by style
|
|
/// recalculation can be sent.
|
|
pub new_animations_sender: Sender<Animation<Impl>>,
|
|
}
|
|
|
|
impl<Impl: SelectorImplExt> LocalStyleContext<Impl> {
|
|
pub fn new(local_context_creation_data: &LocalStyleContextCreationInfo<Impl>) -> Self {
|
|
LocalStyleContext {
|
|
applicable_declarations_cache: RefCell::new(ApplicableDeclarationsCache::new()),
|
|
style_sharing_candidate_cache: RefCell::new(StyleSharingCandidateCache::new()),
|
|
new_animations_sender: local_context_creation_data.new_animations_sender.clone(),
|
|
}
|
|
}
|
|
}
|
|
|
|
pub trait StyleContext<'a, Impl: SelectorImplExt> {
|
|
fn shared_context(&self) -> &'a SharedStyleContext<Impl>;
|
|
fn local_context(&self) -> &LocalStyleContext<Impl>;
|
|
}
|
|
|
|
/// Why we're doing reflow.
|
|
#[derive(PartialEq, Copy, Clone, Debug)]
|
|
pub enum ReflowGoal {
|
|
/// We're reflowing in order to send a display list to the screen.
|
|
ForDisplay,
|
|
/// We're reflowing in order to satisfy a script query. No display list will be created.
|
|
ForScriptQuery,
|
|
}
|