use crate::filter_op_declare::{Arena, MorthOpFilterFlat2DRow};
use crate::flat_se::AnalyzedSe;
use crate::op_type::MorphOp;
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "avx"))]
use crate::ops::avx::{MorphOpFilterAvx2DRow, MorphOpFilterAvx2DRowF32, MorphOpFilterAvx2DRowU16};
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
use crate::ops::neon::{
MorphOpFilterNeon2DRow, MorphOpFilterNeon2DRowF32, MorphOpFilterNeon2DRowU16,
};
#[cfg(all(any(target_arch = "x86", target_arch = "x86_64"), feature = "sse"))]
use crate::ops::sse::{MorphOpFilterSse2DRow, MorphOpFilterSse2DRowF32, MorphOpFilterSse2DRowU16};
use crate::ops::MorphFilterFlat2DRow;
use crate::unsafe_slice::UnsafeSlice;
use crate::ImageSize;
pub struct MorthFilterFlat2DRow<T>
where
T: 'static,
{
pub(crate) handler: Box<dyn MorthOpFilterFlat2DRow<T> + Sync + Send>,
}
impl<T> MorthOpFilterFlat2DRow<T> for MorthFilterFlat2DRow<T> {
unsafe fn dispatch_row(
&self,
arena: &Arena<T>,
dst: &UnsafeSlice<T>,
image_size: ImageSize,
analyzed_se: AnalyzedSe,
y: usize,
) {
self.handler
.dispatch_row(arena, dst, image_size, analyzed_se, y)
}
}
pub trait Row2DFilter<T> {
fn get_filter(op: MorphOp) -> MorthFilterFlat2DRow<T>;
}
impl Row2DFilter<u8> for u8 {
fn get_filter(op: MorphOp) -> MorthFilterFlat2DRow<u8> {
MorthFilterFlat2DRow {
handler: match op {
MorphOp::Dilate => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<u8> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Dilate as u8 }>::default());
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result = Box::new(
MorphOpFilterNeon2DRow::<{ MorphOp::Dilate as u8 }>::default(),
);
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRow::<{ MorphOp::Dilate as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRow::<{ MorphOp::Dilate as u8 }>::default(),
);
}
}
_result
}
MorphOp::Erode => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<u8> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Erode as u8 }>::default());
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result =
Box::new(MorphOpFilterNeon2DRow::<{ MorphOp::Erode as u8 }>::default());
}
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRow::<{ MorphOp::Erode as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRow::<{ MorphOp::Erode as u8 }>::default(),
);
}
}
_result
}
},
}
}
}
impl Row2DFilter<f32> for f32 {
fn get_filter(op: MorphOp) -> MorthFilterFlat2DRow<f32> {
MorthFilterFlat2DRow {
handler: match op {
MorphOp::Dilate => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<f32> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Dilate as u8 }>::default());
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRowF32::<{ MorphOp::Dilate as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRowF32::<{ MorphOp::Dilate as u8 }>::default(),
);
}
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result = Box::new(
MorphOpFilterNeon2DRowF32::<{ MorphOp::Dilate as u8 }>::default(),
);
}
_result
}
MorphOp::Erode => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<f32> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Erode as u8 }>::default());
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRowF32::<{ MorphOp::Erode as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRowF32::<{ MorphOp::Erode as u8 }>::default(),
);
}
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result = Box::new(
MorphOpFilterNeon2DRowF32::<{ MorphOp::Erode as u8 }>::default(),
);
}
_result
}
},
}
}
}
impl Row2DFilter<u16> for u16 {
fn get_filter(op: MorphOp) -> MorthFilterFlat2DRow<u16> {
MorthFilterFlat2DRow {
handler: match op {
MorphOp::Dilate => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<u16> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Dilate as u8 }>::default());
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRowU16::<{ MorphOp::Dilate as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRowU16::<{ MorphOp::Dilate as u8 }>::default(),
);
}
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result = Box::new(
MorphOpFilterNeon2DRowU16::<{ MorphOp::Dilate as u8 }>::default(),
);
}
_result
}
MorphOp::Erode => {
let mut _result: Box<dyn MorthOpFilterFlat2DRow<u16> + Sync + Send> =
Box::new(MorphFilterFlat2DRow::<{ MorphOp::Erode as u8 }>::default());
#[cfg(any(target_arch = "x86", target_arch = "x86_64"))]
{
#[cfg(feature = "sse")]
if std::arch::is_x86_feature_detected!("sse4.1") {
_result = Box::new(
MorphOpFilterSse2DRowU16::<{ MorphOp::Erode as u8 }>::default(),
);
}
#[cfg(feature = "avx")]
if std::arch::is_x86_feature_detected!("avx2") {
_result = Box::new(
MorphOpFilterAvx2DRowU16::<{ MorphOp::Erode as u8 }>::default(),
);
}
}
#[cfg(all(target_arch = "aarch64", feature = "neon"))]
{
_result = Box::new(
MorphOpFilterNeon2DRowU16::<{ MorphOp::Erode as u8 }>::default(),
);
}
_result
}
},
}
}
}