use crate::{
filters::{
FilterRegion,
HasFilterRegion,
primitives::PrimitiveBuilder,
},
paint::ResourceIri,
primitives::FilterInput,
utils::ElementWriter,
};
use std::fmt::{
Display,
Formatter,
};
#[derive(Debug, Hash, Eq, PartialEq, Copy, Clone, Default)]
pub struct Tile {
input: Option<FilterInput>,
region: FilterRegion,
}
impl Tile {
pub(crate) fn new() -> Self {
Tile::default()
}
}
impl HasFilterRegion for Tile {
fn region_mut(&mut self) -> &mut FilterRegion {
&mut self.region
}
}
impl ResourceIri for Tile {}
impl Display for Tile {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
ElementWriter::new(f, "feTile")?
.write(|out| self.region.fmt(out))?
.attr("in", self.input.map(|x| (x,)))?
.attr("result", (self.iri(),))?
.close()
}
}
impl<'a> PrimitiveBuilder<'a, Tile> {
pub fn input<T>(mut self, input: T) -> Self
where
T: Into<FilterInput>,
{
self.inner.input = Some(input.into());
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
filters::{
FilterContext,
FilterRegionConfig,
},
test_utils::assert_xml,
};
#[test]
fn renders_with_filter_region() {
let ctx = FilterContext::default();
ctx.tile().x(0.5).y(0.6).width(110).height(120).finish();
let node = &ctx.into_primitives()[0];
assert_xml(
node.to_string(),
format!(
r#"<feTile x="0.5" y="0.6" width="110" height="120" result="{}" />"#,
node.iri()
),
);
}
#[test]
fn renders() {
let ctx = FilterContext::default();
ctx.tile().finish();
let node = &ctx.into_primitives()[0];
assert_xml(
node.to_string(),
format!(r#"<feTile result="{}" />"#, node.iri()),
);
}
#[test]
fn renders_with_attrs() {
let ctx = FilterContext::default();
let input = FilterInput::source_alpha();
ctx.tile().input(input).finish();
let node = &ctx.into_primitives()[0];
assert_xml(
node.to_string(),
format!(r#"<feTile in="{input}" result="{}" />"#, node.iri()),
);
}
}