singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use crate::{
    error::Result,
    image::{filtering, view::ChannelLayout},
    pipeline::{ImageAllocator, Workspace},
    types::{BorderType, Point, PointPolar, Size},
};

use super::{ImageBacking, ImagePipeline};

pub(super) use super::filtering_dispatch::*;

#[path = "filtering_compressed_marker_labels.rs"]
mod compressed_marker_labels;
#[path = "filtering_outputs.rs"]
mod outputs;

pub use compressed_marker_labels::CompressedMarkerLabels;
pub use outputs::{GradientVector, HistogramOfGradients, HoughLines};

impl<'a, T, L> ImagePipeline<'a, T, L> {
    pub fn label_markers_uf_buffer_size(roi: Size) -> Result<usize> {
        filtering::label_markers_uf_buffer_size_u32_c1(roi)
    }

    pub fn compress_marker_labels_uf_buffer_size(starting_number: i32) -> Result<usize> {
        filtering::compress_marker_labels_uf_buffer_size_u32_c1(starting_number)
    }

    pub fn flood_fill_buffer_size(roi: Size) -> Result<usize> {
        filtering::flood_fill_buffer_size(roi)
    }

    pub fn filter_canny_border_buffer_size(roi: Size) -> Result<usize> {
        filtering::filter_canny_border_buffer_size(roi)
    }

    pub fn filter_harris_corners_border_buffer_size(roi: Size) -> Result<usize> {
        filtering::filter_harris_corners_border_buffer_size(roi)
    }

    pub fn filter_hough_line_buffer_size(
        roi: Size,
        delta: PointPolar,
        max_line_count: i32,
    ) -> Result<usize> {
        filtering::filter_hough_line_buffer_size(roi, delta, max_line_count)
    }

    pub fn filter_gauss_pyramid_layer_down_border_destination_roi(
        source_roi: Size,
        rate: f32,
    ) -> Result<Size> {
        filtering::filter_gauss_pyramid_layer_down_border_dst_roi(source_roi, rate)
    }

    pub fn filter_gauss_pyramid_layer_up_border_destination_roi(
        source_roi: Size,
        rate: f32,
    ) -> Result<(Size, Size)> {
        filtering::filter_gauss_pyramid_layer_up_border_dst_roi(source_roi, rate)
    }

    pub fn distance_transform_pba_buffer_size(roi: Size) -> Result<usize> {
        filtering::distance_transform_pba_buffer_size(roi)
    }

    pub fn distance_transform_pba_antialiasing_buffer_size(roi: Size) -> Result<usize> {
        filtering::distance_transform_pba_antialiasing_buffer_size(roi)
    }

    pub fn signed_distance_transform_pba_buffer_size(roi: Size) -> Result<usize> {
        filtering::signed_distance_transform_pba_buffer_size(roi)
    }

    pub fn signed_distance_transform_pba_64f_buffer_size(roi: Size) -> Result<usize> {
        filtering::signed_distance_transform_pba_64f_buffer_size(roi)
    }

    pub fn signed_distance_transform_pba_antialiasing_buffer_size(roi: Size) -> Result<usize> {
        filtering::signed_distance_transform_pba_antialiasing_buffer_size(roi)
    }

    pub fn segment_watershed_u8_buffer_size(roi: Size) -> Result<usize> {
        filtering::segment_watershed_buffer_size_u8_c1(roi)
    }

    pub fn segment_watershed_u16_buffer_size(roi: Size) -> Result<usize> {
        filtering::segment_watershed_buffer_size_u16_c1(roi)
    }

    pub fn segment_watershed_buffer_size<U: filtering::SegmentWatershedC1InPlace>(
        roi: Size,
    ) -> Result<usize> {
        filtering::segment_watershed_buffer_size_for::<U>(roi)
    }
}

impl<'a, T, L> ImagePipeline<'a, T, L>
where
    T: Copy,
    L: ChannelLayout,
    Workspace: ImageAllocator<T, L>,
    Self: AdaptiveBoxThresholdBorderImage<T, L>,
{
    pub fn filter_threshold_adaptive_box_border(
        self,
        source_offset: Point,
        mask_size: Size,
        delta: f32,
        value_greater_than: T,
        value_less_or_equal: T,
        border_type: BorderType,
    ) -> Result<Self> {
        let mut destination = self.workspace.image::<T, L>(self.size())?;

        {
            let source = self.view()?;
            let mut destination_view = destination.view_mut()?;
            <Self as AdaptiveBoxThresholdBorderImage<T, L>>::filter_threshold_adaptive_box_border_image(
                self.stream_context,
                &source,
                source_offset,
                &mut destination_view,
                mask_size,
                delta,
                value_greater_than,
                value_less_or_equal,
                border_type,
            )?;
        }

        Ok(Self {
            stream_context: self.stream_context,
            workspace: self.workspace,
            backing: ImageBacking::Owned(destination),
        })
    }
}