use crate::{
core::{reflect::prelude::*, uuid::Uuid, TypeUuidProvider},
font::{Font, FontResource},
};
use fyrox_resource::{
io::ResourceIo,
loader::{BoxedImportOptionsLoaderFuture, BoxedLoaderFuture, LoaderPayload, ResourceLoader},
manager::ResourceManager,
options::{
try_get_import_settings, try_get_import_settings_opaque, BaseImportOptions, ImportOptions,
},
state::LoadError,
};
use serde::{Deserialize, Serialize};
use std::{path::PathBuf, sync::Arc};
fn default_page_size() -> usize {
1024
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Reflect, Eq)]
pub struct FontImportOptions {
#[serde(default = "default_page_size")]
pub page_size: usize,
pub bold: Option<FontResource>,
pub italic: Option<FontResource>,
pub bold_italic: Option<FontResource>,
pub fallbacks: Vec<Option<FontResource>>,
}
impl Default for FontImportOptions {
fn default() -> Self {
Self {
page_size: default_page_size(),
bold: None,
italic: None,
bold_italic: None,
fallbacks: Vec::default(),
}
}
}
impl ImportOptions for FontImportOptions {}
pub struct FontLoader {
pub resource_manager: ResourceManager,
default_import_options: FontImportOptions,
}
impl FontLoader {
pub fn new(resource_manager: ResourceManager) -> Self {
Self {
resource_manager,
default_import_options: FontImportOptions::default(),
}
}
}
impl ResourceLoader for FontLoader {
fn extensions(&self) -> &[&str] {
&["ttf", "otf"]
}
fn data_type_uuid(&self) -> Uuid {
Font::type_uuid()
}
fn default_import_options(&self) -> Option<Box<dyn BaseImportOptions>> {
Some(Box::new(self.default_import_options.clone()))
}
fn try_load_import_settings(
&self,
resource_path: PathBuf,
io: Arc<dyn ResourceIo>,
) -> BoxedImportOptionsLoaderFuture {
Box::pin(async move {
try_get_import_settings_opaque::<FontImportOptions>(&resource_path, &*io).await
})
}
fn load(&self, path: PathBuf, io: Arc<dyn ResourceIo>) -> BoxedLoaderFuture {
let default_import_options = self.default_import_options.clone();
let resource_manager = self.resource_manager.clone();
Box::pin(async move {
let io = io.as_ref();
let import_options = try_get_import_settings(&path, io)
.await
.unwrap_or(default_import_options);
let font = Font::from_file(&path, import_options, io, &resource_manager)
.await
.map_err(LoadError::new)?;
Ok(LoaderPayload::new(font))
})
}
}