use crate::renderer::bridge::ffi::Size;
use crate::ImageRenderer;
use image::DynamicImage;
mod symbol_layer;
pub use symbol_layer::SymbolLayer;
mod geojson_source;
pub use geojson_source::GeoJsonSource;
pub use geojson_source::Latitude;
pub use geojson_source::Longitude;
pub trait StyleSourceRef {
fn source_id(&self) -> &str;
}
pub trait StyleImageRef {
fn image_id(&self) -> &str;
}
#[derive(Clone, Debug)]
pub struct SourceId(String);
impl SourceId {
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl StyleSourceRef for SourceId {
fn source_id(&self) -> &str {
self.as_str()
}
}
#[derive(Clone, Debug)]
pub struct ImageId(String);
impl ImageId {
#[must_use]
pub fn as_str(&self) -> &str {
&self.0
}
}
impl StyleImageRef for ImageId {
fn image_id(&self) -> &str {
self.as_str()
}
}
#[derive(Debug)]
pub enum StyleSource {
GeoJson(GeoJsonSource),
}
#[derive(Debug)]
pub enum StyleLayer {
Symbol(SymbolLayer),
}
#[derive(Debug)]
pub struct Style<'a, S> {
image_renderer: &'a mut ImageRenderer<S>,
}
impl<'a, S> Style<'a, S> {
pub fn get_ref(image_renderer: &'a mut ImageRenderer<S>) -> Self {
Self { image_renderer }
}
pub fn load_url(&mut self, url: &str) {
self.image_renderer.instance.pin_mut().style_load_from_url(url);
}
pub fn add_image(
&mut self,
id: &str,
image: &DynamicImage,
single_distance_field: bool,
) -> ImageId {
use image::EncodableLayout;
let image = image.to_rgba8();
self.image_renderer.instance.pin_mut().style_add_image(
id,
image.as_bytes(),
Size::new(super::Width(image.width()), super::Height(image.height())),
single_distance_field,
);
ImageId(id.to_owned())
}
pub fn remove_image(&mut self, id: &str) {
self.image_renderer.instance.pin_mut().style_remove_image(id);
}
pub fn add_source<T: Into<StyleSource>>(&mut self, source: T) -> SourceId {
match source.into() {
StyleSource::GeoJson(source) => {
let source_id = SourceId(source.source_id().to_owned());
self.image_renderer
.instance
.pin_mut()
.style_add_geojson_source(source.into_inner());
source_id
}
}
}
pub fn add_layer<T: Into<StyleLayer>>(&mut self, layer: T) {
match layer.into() {
StyleLayer::Symbol(layer) => {
self.image_renderer.instance.pin_mut().style_add_symbol_layer(layer.into_inner());
}
}
}
}