use crate::core::Size;
use crate::platform::profile::surface_policy;
use std::sync::atomic::{AtomicBool, Ordering};
static EMBEDDED_MODE: AtomicBool = AtomicBool::new(false);
static LOW_MEMORY_MODE: AtomicBool = AtomicBool::new(false);
pub fn is_embedded_mode() -> bool {
EMBEDDED_MODE.load(Ordering::Relaxed)
}
pub fn set_embedded_mode(enabled: bool) {
EMBEDDED_MODE.store(enabled, Ordering::Relaxed);
}
pub fn is_low_memory_mode() -> bool {
LOW_MEMORY_MODE.load(Ordering::Relaxed)
}
pub fn set_low_memory_mode(enabled: bool) {
LOW_MEMORY_MODE.store(enabled, Ordering::Relaxed);
}
fn caller_requested_reduction() -> bool {
is_embedded_mode() || is_low_memory_mode()
}
pub fn recommended_buffer_size() -> Size {
let full = surface_policy();
if caller_requested_reduction() {
Size::new(800, 600)
} else {
Size::new(full.recommended_window.0, full.recommended_window.1)
}
}
pub fn max_texture_size() -> u32 {
surface_policy().max_texture
}
pub fn font_cache_size() -> usize {
if is_low_memory_mode() {
(surface_policy().font_cache_bytes / 4).max(64 * 1024)
} else {
surface_policy().font_cache_bytes
}
}
pub fn event_queue_size() -> usize {
surface_policy().event_queue
}
pub fn max_widgets() -> usize {
surface_policy().max_widgets
}
pub fn init_embedded(config: crate::embedded::config::EmbeddedConfig) {
set_embedded_mode(true);
set_low_memory_mode(config.low_memory_mode);
if let Some(dpi) = config.fixed_dpi {
crate::embedded::dpi::set_fixed_dpi(dpi);
}
}
pub fn init_desktop() {
set_embedded_mode(false);
set_low_memory_mode(false);
crate::embedded::dpi::clear_fixed_dpi();
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_embedded_mode() {
assert!(!is_embedded_mode());
set_embedded_mode(true);
assert!(is_embedded_mode());
set_embedded_mode(false);
assert!(!is_embedded_mode());
}
#[test]
fn test_low_memory_mode() {
assert!(!is_low_memory_mode());
set_low_memory_mode(true);
assert!(is_low_memory_mode());
set_low_memory_mode(false);
assert!(!is_low_memory_mode());
}
#[test]
fn test_buffer_size() {
use crate::platform::profile::surface_policy;
set_low_memory_mode(true);
assert_eq!(recommended_buffer_size().width, 800, "a reduced request wins");
set_low_memory_mode(false);
let policy = surface_policy();
let size = recommended_buffer_size();
assert_eq!(size.width, policy.recommended_window.0);
assert_eq!(size.height, policy.recommended_window.1);
}
#[test]
fn budgets_follow_the_policy_and_can_be_narrowed() {
use crate::platform::profile::surface_policy;
let policy = surface_policy();
set_embedded_mode(false);
set_low_memory_mode(false);
assert_eq!(max_texture_size(), policy.max_texture);
assert_eq!(event_queue_size(), policy.event_queue);
assert_eq!(font_cache_size(), policy.font_cache_bytes);
assert_eq!(max_widgets(), policy.max_widgets);
set_low_memory_mode(true);
assert!(
font_cache_size() <= policy.font_cache_bytes,
"a caller request may only narrow the profile's budget",
);
set_low_memory_mode(false);
}
}