use crate::{Device, Error, PixelFormat, SpatialScalerColorProcessingMode, Texture};
pub struct SpatialScalerDescriptor {
pub(crate) inner: metal_rust_ffi::SpatialScalerDescriptor,
}
impl SpatialScalerDescriptor {
pub fn new() -> Result<Self, Error> {
metal_rust_ffi::SpatialScalerDescriptor::new()
.map(|inner| Self { inner })
.map_err(Error::from_ffi)
}
pub fn configure(
&self,
color_format: PixelFormat,
output_format: PixelFormat,
input_width: usize,
input_height: usize,
output_width: usize,
output_height: usize,
) -> Result<(), Error> {
self.inner
.configure(
color_format,
output_format,
input_width,
input_height,
output_width,
output_height,
)
.map_err(Error::from_ffi)
}
#[must_use]
pub fn color_texture_format(&self) -> PixelFormat {
self.inner.color_texture_format()
}
pub fn set_color_texture_format(&self, value: PixelFormat) {
self.inner.set_color_texture_format(value);
}
#[must_use]
pub fn output_texture_format(&self) -> PixelFormat {
self.inner.output_texture_format()
}
pub fn set_output_texture_format(&self, value: PixelFormat) {
self.inner.set_output_texture_format(value);
}
#[must_use]
pub fn input_size(&self) -> (usize, usize) {
self.inner.input_size()
}
pub fn set_input_size(&self, width: usize, height: usize) -> Result<(), Error> {
self.inner
.set_input_size(width, height)
.map_err(Error::from_ffi)
}
#[must_use]
pub fn output_size(&self) -> (usize, usize) {
self.inner.output_size()
}
pub fn set_output_size(&self, width: usize, height: usize) -> Result<(), Error> {
self.inner
.set_output_size(width, height)
.map_err(Error::from_ffi)
}
pub fn color_processing_mode(&self) -> Result<SpatialScalerColorProcessingMode, Error> {
self.inner.color_processing_mode().map_err(Error::from_ffi)
}
pub fn set_color_processing_mode(&self, value: SpatialScalerColorProcessingMode) {
self.inner.set_color_processing_mode(value);
}
#[must_use]
pub fn supports_metal4_fx(&self, device: &Device) -> bool {
self.inner.supports_metal4_fx(&device.inner)
}
#[must_use]
pub fn supports_device(&self, device: &Device) -> bool {
self.inner.supports_device(&device.inner)
}
pub fn new_scaler(&self, device: &Device) -> Result<SpatialScaler, Error> {
self.inner
.new_scaler(&device.inner)
.map(|inner| SpatialScaler { inner })
.map_err(Error::from_ffi)
}
}
pub struct SpatialScaler {
pub(crate) inner: metal_rust_ffi::SpatialScaler,
}
impl SpatialScaler {
pub fn encode(&self, command_buffer: &mut crate::CommandBuffer) {
self.inner.encode(&command_buffer.inner);
}
#[must_use]
pub fn color_texture_usage(&self) -> u64 {
self.inner.color_texture_usage()
}
#[must_use]
pub fn output_texture_usage(&self) -> u64 {
self.inner.output_texture_usage()
}
#[must_use]
pub fn color_texture(&self) -> Option<Texture> {
self.inner.color_texture().map(Texture::from_ffi)
}
#[must_use]
pub fn output_texture(&self) -> Option<Texture> {
self.inner.output_texture().map(Texture::from_ffi)
}
pub fn color_processing_mode(&self) -> Result<SpatialScalerColorProcessingMode, Error> {
self.inner.color_processing_mode().map_err(Error::from_ffi)
}
pub fn set_input_content_size(&self, width: usize, height: usize) -> Result<(), Error> {
self.inner
.set_input_content_size(width, height)
.map_err(Error::from_ffi)
}
pub fn set_textures(
&self,
color: Option<&Texture>,
output: Option<&Texture>,
) -> Result<(), Error> {
self.inner
.set_textures(
color.map(|texture| &texture.inner),
output.map(|texture| &texture.inner),
)
.map_err(Error::from_ffi)
}
}