use std::sync::{Arc, Mutex};
use bitflags::bitflags;
use blitz_traits::shell::{ColorScheme, Viewport};
use parley::FontContext;
use selectors::matching::QuirksMode;
use style::device::Device;
use style::media_queries::MediaType;
use style::properties::ComputedValues;
use style::properties::style_structs::Font;
use style::queries::values::PrefersColorScheme;
use style::servo::media_features::PointerCapabilities;
use crate::font_metrics::BlitzFontMetricsProvider;
bitflags! {
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub(crate) struct DeviceChanges: u8 {
const VIEWPORT_SIZE = 0b0000_0001;
const SCALE = 0b0000_0010;
const COLOR_SCHEME = 0b0000_0100;
const MEDIA_TYPE = 0b0000_1000;
}
}
impl DeviceChanges {
pub(crate) fn from_viewports(old: &Viewport, new: &Viewport) -> Self {
let mut changes = Self::empty();
if old.logical_size() != new.logical_size() {
changes |= Self::VIEWPORT_SIZE;
}
if old.scale_f64() != new.scale_f64() {
changes |= Self::SCALE;
}
if old.color_scheme != new.color_scheme {
changes |= Self::COLOR_SCHEME;
}
changes
}
}
pub(crate) fn make_device(
viewport: &Viewport,
media_type: MediaType,
font_ctx: Arc<Mutex<FontContext>>,
) -> Device {
let (width, height) = viewport.logical_size();
let viewport_size = euclid::Size2D::new(width, height);
let device_size = euclid::Size2D::new(width, height) * viewport.scale();
let device_pixel_ratio = euclid::Scale::new(viewport.scale());
Device::new(
media_type,
QuirksMode::NoQuirks,
viewport_size,
device_size,
device_pixel_ratio,
Box::new(BlitzFontMetricsProvider { font_ctx }),
ComputedValues::initial_values_with_font_override(Font::initial_values()),
match viewport.color_scheme {
ColorScheme::Light => PrefersColorScheme::Light,
ColorScheme::Dark => PrefersColorScheme::Dark,
},
PointerCapabilities::default(),
PointerCapabilities::default(),
)
}