magic-kernel 0.1.1

Implementation of Magic Kernel family of resizing algorithms.
Documentation
use crate::imagef64::{Column, ImageF64, Row};

use super::{kernel1d::Kernel1D, KernelDefinition};

pub(crate) struct Kernel2D {
    x: Kernel1D,
    y: Kernel1D,
}

impl Kernel2D {
    pub fn new<Def: KernelDefinition>(from_size: (u32, u32), to_size: (u32, u32)) -> Self {
        Self {
            x: Kernel1D::new::<Def>(from_size.0, to_size.0),
            y: Kernel1D::new::<Def>(from_size.1, to_size.1),
        }
    }

    pub fn apply(&self, image: &ImageF64) -> ImageF64 {
        let mut tmp = ImageF64::new_empty(image.channels(), self.x.number_out, image.height());
        for channel in 0..image.channels() {
            for y in 0..image.height() {
                let mut row = Row {
                    in_: image,
                    out: &mut tmp,
                    channel,
                    y,
                };

                self.x.apply_to(&mut row);
            }
        }

        let mut out = ImageF64::new_empty(image.channels(), self.x.number_out, self.y.number_out);
        for channel in 0..image.channels() {
            for x in 0..tmp.width() {
                let mut column = Column {
                    in_: &mut tmp,
                    out: &mut out,
                    channel,
                    x,
                };

                self.y.apply_to(&mut column);
            }
        }

        out
    }
}