use std::marker::PhantomData;
use std::num::NonZeroU32;
use std::rc::Rc;
use crate::bridge::ffi;
use crate::renderer::map_observer::MapObserverCallbacks;
use crate::renderer::{Continuous, ImageRenderer, MapMode, Static, Tile};
use crate::ResourceOptions;
#[derive(Debug)]
pub struct ImageRendererBuilder {
width: NonZeroU32,
height: NonZeroU32,
pixel_ratio: f32,
resource_options: Option<ResourceOptions>,
}
impl Default for ImageRendererBuilder {
#[allow(clippy::missing_panics_doc, reason = "infallible")]
fn default() -> Self {
Self {
width: NonZeroU32::new(512).unwrap(),
height: NonZeroU32::new(512).unwrap(),
pixel_ratio: 1.0,
resource_options: None,
}
}
}
impl ImageRendererBuilder {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
#[allow(clippy::needless_pass_by_value, reason = "false positive")]
pub fn with_size(mut self, width: NonZeroU32, height: NonZeroU32) -> Self {
self.width = width;
self.height = height;
self
}
#[must_use]
pub fn with_pixel_ratio(mut self, pixel_ratio: f32) -> Self {
self.pixel_ratio = pixel_ratio;
self
}
#[must_use]
#[allow(clippy::needless_pass_by_value, reason = "false positive")]
pub fn with_resource_options(mut self, resource_options: ResourceOptions) -> Self {
self.resource_options = Some(resource_options);
self
}
#[must_use]
pub fn build_static_renderer(self) -> ImageRenderer<Static> {
ImageRenderer::new(MapMode::Static, self)
}
#[must_use]
pub fn build_tile_renderer(self) -> ImageRenderer<Tile> {
ImageRenderer::new(MapMode::Tile, self)
}
#[must_use]
pub fn build_continuous_renderer(self) -> ImageRenderer<Continuous> {
ImageRenderer::new(MapMode::Continuous, self)
}
}
impl<S> ImageRenderer<S> {
fn new(map_mode: MapMode, opts: ImageRendererBuilder) -> Self {
let resource_options = opts.resource_options.unwrap_or_default();
let mut map = ffi::MapRenderer_new(
map_mode,
opts.width.get(),
opts.height.get(),
opts.pixel_ratio,
resource_options.as_ref(),
);
let observer_callbacks = Rc::new(MapObserverCallbacks::default());
observer_callbacks.install(&map.pin_mut().observer());
Self {
instance: map,
observer_callbacks,
style_specified: false,
_marker: PhantomData,
_not_send: PhantomData,
}
}
}