use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct FontVariableAxisInfo {
pub tag: String,
pub min_bits: u32,
pub max_bits: u32,
pub default_bits: u32,
}
impl FontVariableAxisInfo {
pub fn min(&self) -> f32 {
f32::from_bits(self.min_bits)
}
pub fn max(&self) -> f32 {
f32::from_bits(self.max_bits)
}
pub fn default(&self) -> f32 {
f32::from_bits(self.default_bits)
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct FontCatalog {
pub families: Vec<String>,
pub revision: u64,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct FontCatalogEntry {
pub family: String,
pub has_variable_axes: bool,
pub known_variable_axes: Vec<String>,
#[serde(default)]
pub variable_axes: Vec<FontVariableAxisInfo>,
pub is_monospace_candidate: bool,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct FontCatalogMetadata {
pub entries: Vec<FontCatalogEntry>,
pub revision: u64,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum BundledFontBaselineSource {
#[default]
None,
BundledProfile,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct BundledFontBaselineSnapshot {
pub source: BundledFontBaselineSource,
pub profile_name: Option<String>,
pub asset_bundle: Option<String>,
pub asset_keys: Vec<String>,
pub provided_roles: Vec<String>,
pub guaranteed_generic_families: Vec<String>,
}
impl BundledFontBaselineSnapshot {
pub fn none() -> Self {
Self::default()
}
pub fn bundled_profile(
profile_name: impl Into<String>,
asset_bundle: impl Into<String>,
asset_keys: Vec<String>,
provided_roles: Vec<String>,
guaranteed_generic_families: Vec<String>,
) -> Self {
Self {
source: BundledFontBaselineSource::BundledProfile,
profile_name: Some(profile_name.into()),
asset_bundle: Some(asset_bundle.into()),
asset_keys,
provided_roles,
guaranteed_generic_families,
}
}
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum RendererFontSourceLane {
#[default]
BundledStartup,
AssetRequest,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct RendererFontSourceRecord {
pub source_lane: RendererFontSourceLane,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub asset_request: Option<fret_assets::AssetRequest>,
pub byte_hash: u64,
pub byte_len: u64,
pub added_face_count: u64,
}
impl RendererFontSourceRecord {
pub fn bundled_startup(
asset_request: fret_assets::AssetRequest,
byte_hash: u64,
byte_len: u64,
added_face_count: u64,
) -> Self {
Self {
source_lane: RendererFontSourceLane::BundledStartup,
asset_request: Some(asset_request),
byte_hash,
byte_len,
added_face_count,
}
}
pub fn asset_request(
asset_request: fret_assets::AssetRequest,
byte_hash: u64,
byte_len: u64,
added_face_count: u64,
) -> Self {
Self {
source_lane: RendererFontSourceLane::AssetRequest,
asset_request: Some(asset_request),
byte_hash,
byte_len,
added_face_count,
}
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct RendererFontEnvironmentSnapshot {
pub revision: u64,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub text_font_stack_key: Option<u64>,
#[serde(default)]
pub sources: Vec<RendererFontSourceRecord>,
}
impl RendererFontEnvironmentSnapshot {
pub fn note_text_font_stack_key(&mut self, text_font_stack_key: u64) -> bool {
if self.text_font_stack_key == Some(text_font_stack_key) {
return false;
}
self.text_font_stack_key = Some(text_font_stack_key);
self.revision = self.revision.saturating_add(1);
true
}
pub fn extend_sources_unique(
&mut self,
sources: impl IntoIterator<Item = RendererFontSourceRecord>,
) -> bool {
let mut changed = false;
for source in sources {
if self.sources.iter().any(|existing| existing == &source) {
continue;
}
self.sources.push(source);
changed = true;
}
changed
}
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct RendererSvgTextBridgeDiagnosticsSnapshot {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub revision: Option<u64>,
#[serde(default)]
pub selection_misses: Vec<RendererSvgTextFontSelectionMissRecord>,
#[serde(default)]
pub fallback_records: Vec<RendererSvgTextFontFallbackRecord>,
#[serde(default)]
pub missing_glyphs: Vec<RendererSvgTextMissingGlyphRecord>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RendererSvgTextFontSelectionMissRecord {
pub requested_families: Vec<String>,
pub weight: u16,
pub style: String,
pub stretch: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RendererSvgTextFontFallbackRecord {
pub text: String,
pub from_family: String,
pub to_family: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct RendererSvgTextMissingGlyphRecord {
pub text: String,
pub resolved_family: String,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct TextFontStackKey(pub u64);
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct SystemFontRescanState {
pub in_flight: bool,
pub pending: bool,
}