Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
111 changes: 64 additions & 47 deletions style/device/servo.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,44 +55,44 @@ pub trait FontMetricsProvider: Debug + Sync {

#[derive(Debug, MallocSizeOf)]
pub(super) struct ExtraDeviceData {
/// Data which Stylo uses to evaluate media queries
media_data: MediaData,
/// An implementation of a trait which implements support for querying font metrics.
#[ignore_malloc_size_of = "Owned by embedder"]
font_metrics_provider: Box<dyn FontMetricsProvider>,
}

#[derive(Debug, MallocSizeOf, Clone, PartialEq)]
/// Data which Stylo uses to evaluate media queries
pub struct MediaData {
/// The current media type used by de device.
media_type: MediaType,
pub media_type: MediaType,
/// The current viewport size, in CSS pixels.
viewport_size: Size2D<f32, CSSPixel>,
pub viewport_size: Size2D<f32, CSSPixel>,
/// The current screen size, in device pixels.
device_size: Size2D<f32, DevicePixel>,
pub device_size: Size2D<f32, DevicePixel>,
/// The current device pixel ratio, from CSS pixels to device pixels.
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
pub device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
/// The current quirks mode.
#[ignore_malloc_size_of = "Pure stack type"]
quirks_mode: QuirksMode,
pub quirks_mode: QuirksMode,
/// Whether the user prefers light mode or dark mode
#[ignore_malloc_size_of = "Pure stack type"]
prefers_color_scheme: PrefersColorScheme,
pub prefers_color_scheme: PrefersColorScheme,
/// The capabilities of the primary pointer input
#[ignore_malloc_size_of = "Pure stack type"]
primary_pointer_capabilities: PointerCapabilities,
pub primary_pointer_capabilities: PointerCapabilities,
/// The union of the capabilities of all pointer inputs
#[ignore_malloc_size_of = "Pure stack type"]
all_pointer_capabilities: PointerCapabilities,
/// An implementation of a trait which implements support for querying font metrics.
#[ignore_malloc_size_of = "Owned by embedder"]
font_metrics_provider: Box<dyn FontMetricsProvider>,
pub all_pointer_capabilities: PointerCapabilities,
}

impl Device {
/// Trivially construct a new `Device`.
pub fn new(
media_type: MediaType,
quirks_mode: QuirksMode,
viewport_size: Size2D<f32, CSSPixel>,
device_size: Size2D<f32, DevicePixel>,
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
font_metrics_provider: Box<dyn FontMetricsProvider>,
default_values: Arc<ComputedValues>,
prefers_color_scheme: PrefersColorScheme,
primary_pointer_capabilities: PointerCapabilities,
all_pointer_capabilities: PointerCapabilities,
font_metrics_provider: Box<dyn FontMetricsProvider>,
media_data: MediaData,
) -> Device {
let root_style = RwLock::new(Arc::clone(&default_values));
Device {
Expand All @@ -113,14 +113,7 @@ impl Device {
default_values,
body_text_color: AtomicU32::new(AbsoluteColor::BLACK.to_nscolor()),
extra: ExtraDeviceData {
media_type,
viewport_size,
device_size,
device_pixel_ratio,
quirks_mode,
prefers_color_scheme,
primary_pointer_capabilities,
all_pointer_capabilities,
media_data,
font_metrics_provider,
},
}
Expand All @@ -146,7 +139,7 @@ impl Device {

/// Get the quirks mode of the current device.
pub fn quirks_mode(&self) -> QuirksMode {
self.extra.quirks_mode
self.extra.media_data.quirks_mode
}

/// Gets the base size given a generic font family.
Expand All @@ -162,9 +155,33 @@ impl Device {
true
}

/// Get the [`MediaData`] associated with this [`Device`].
#[inline]
pub fn media_data(&self) -> &MediaData {
&self.extra.media_data
}

/// Mutate the [`MediaData`] on this [`Device`].
///
/// Note that this does not update any associated `Stylist`. For this you must call
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn media_data_mut(&mut self) -> &mut MediaData {
&mut self.extra.media_data
}

/// Set the [`MediaData`] on this [`Device`].
///
/// Note that this does not update any associated `Stylist`. For this you must call
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_media_data(&mut self, media_data: MediaData) {
self.extra.media_data = media_data;
}

/// Get the viewport size on this [`Device`].
pub fn viewport_size(&self) -> Size2D<f32, CSSPixel> {
self.extra.viewport_size
self.extra.media_data.viewport_size
}

/// Set the viewport size on this [`Device`].
Expand All @@ -173,16 +190,16 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_viewport_size(&mut self, viewport_size: Size2D<f32, CSSPixel>) {
self.extra.viewport_size = viewport_size;
self.extra.media_data.viewport_size = viewport_size;
}

/// Returns the viewport size of the current device in app units, needed,
/// among other things, to resolve viewport units.
#[inline]
pub fn au_viewport_size(&self) -> UntypedSize2D<Au> {
Size2D::new(
Au::from_f32_px(self.extra.viewport_size.width),
Au::from_f32_px(self.extra.viewport_size.height),
Au::from_f32_px(self.extra.media_data.viewport_size.width),
Au::from_f32_px(self.extra.media_data.viewport_size.height),
)
}

Expand All @@ -199,17 +216,17 @@ impl Device {

/// Returns the number of app units per device pixel we're using currently.
pub fn app_units_per_device_pixel(&self) -> i32 {
(AU_PER_PX as f32 / self.extra.device_pixel_ratio.0) as i32
(AU_PER_PX as f32 / self.extra.media_data.device_pixel_ratio.0) as i32
}

/// Returns the device pixel ratio, ignoring the full zoom factor.
pub fn device_pixel_ratio_ignoring_full_zoom(&self) -> Scale<f32, CSSPixel, DevicePixel> {
self.extra.device_pixel_ratio
self.extra.media_data.device_pixel_ratio
}

/// Returns the device pixel ratio.
pub fn device_pixel_ratio(&self) -> Scale<f32, CSSPixel, DevicePixel> {
self.extra.device_pixel_ratio
self.extra.media_data.device_pixel_ratio
}

/// Set a new device pixel ratio on this [`Device`].
Expand All @@ -221,7 +238,7 @@ impl Device {
&mut self,
device_pixel_ratio: Scale<f32, CSSPixel, DevicePixel>,
) {
self.extra.device_pixel_ratio = device_pixel_ratio;
self.extra.media_data.device_pixel_ratio = device_pixel_ratio;
}

/// Set the device size on this [`Device`] (e.g. the available screen dimensions).
Expand All @@ -230,13 +247,13 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_device_size(&mut self, device_size: Size2D<f32, DevicePixel>) {
self.extra.device_size = device_size;
self.extra.media_data.device_size = device_size;
}

/// Returns the screen size of the current device in app units.
#[inline]
pub fn device_size(&self) -> Size2D<f32, DevicePixel> {
self.extra.device_size
self.extra.media_data.device_size
}

/// Gets the size of the scrollbar in CSS pixels.
Expand Down Expand Up @@ -268,12 +285,12 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_media_type(&mut self, media_type: MediaType) {
self.extra.media_type = media_type;
self.extra.media_data.media_type = media_type;
}

/// Return the media type of the current device.
pub fn media_type(&self) -> MediaType {
self.extra.media_type.clone()
self.extra.media_data.media_type.clone()
}

/// Returns whether document colors are enabled.
Expand All @@ -297,12 +314,12 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_color_scheme(&mut self, new_color_scheme: PrefersColorScheme) {
self.extra.prefers_color_scheme = new_color_scheme;
self.extra.media_data.prefers_color_scheme = new_color_scheme;
}

/// Returns the color scheme of this [`Device`].
pub fn color_scheme(&self) -> PrefersColorScheme {
self.extra.prefers_color_scheme
self.extra.media_data.prefers_color_scheme
}

/// Set the [`PointerCapbabilities`] value for the primary pointer on this [`Device`]
Expand All @@ -311,12 +328,12 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_primary_pointer_capabilities(&mut self, capabilities: PointerCapabilities) {
self.extra.primary_pointer_capabilities = capabilities;
self.extra.media_data.primary_pointer_capabilities = capabilities;
}

/// Returns the pointer capabilities of this [`Device`].
pub fn primary_pointer_capabilities(&self) -> PointerCapabilities {
self.extra.primary_pointer_capabilities
self.extra.media_data.primary_pointer_capabilities
}

/// Set the [`PointerCapbabilities`] value for all pointers on this [`Device`]
Expand All @@ -325,12 +342,12 @@ impl Device {
/// `Stylist::media_features_change_changed_style` and
/// `Stylist::force_stylesheet_origins_dirty`.
pub fn set_all_pointer_capabilities(&mut self, capabilities: PointerCapabilities) {
self.extra.all_pointer_capabilities = capabilities;
self.extra.media_data.all_pointer_capabilities = capabilities;
}

/// Returns the pointer capabilities of this [`Device`].
pub fn all_pointer_capabilities(&self) -> PointerCapabilities {
self.extra.all_pointer_capabilities
self.extra.media_data.all_pointer_capabilities
}

pub(crate) fn is_dark_color_scheme(&self, color_scheme_flags: ColorSchemeFlags) -> bool {
Expand Down
2 changes: 1 addition & 1 deletion style/servo/media_features.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ fn eval_prefers_color_scheme(context: &Context, query_value: Option<PrefersColor

bitflags! {
/// https://drafts.csswg.org/mediaqueries-4/#mf-interaction
#[derive(Debug, Clone, Copy)]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct PointerCapabilities: u8 {
/// The input mechanism includes a pointing device of limited accuracy, such as a finger on a touchscreen.
const COARSE = 0b001;
Expand Down