singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use singe_cuda::memory::DeviceMemory;

use crate::{
    context::StreamContext,
    error::Result,
    image::view::{C4, ImageView},
};

use super::{
    HistogramEvenChannelsImage, HistogramRangeChannelsImage, ImageHistograms, ImagePipeline,
    histogram_buffers, histogram_range_buffers, image_histograms,
};

impl<'a, T> ImagePipeline<'a, T, C4>
where
    T: Copy,
    Self: HistogramEvenChannelsImage<T, C4, 4>,
{
    pub fn histogram_even_channels_into(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, C4>,
        histograms: [&mut DeviceMemory<i32>; 4],
        levels: [i32; 4],
        lower_levels: [i32; 4],
        upper_levels: [i32; 4],
    ) -> Result<()> {
        <Self as HistogramEvenChannelsImage<T, C4, 4>>::histogram_even_channels(
            stream_context,
            source,
            histograms,
            levels,
            lower_levels,
            upper_levels,
        )
    }

    pub fn histogram_even_channels(
        self,
        levels: [i32; 4],
        lower_levels: [i32; 4],
        upper_levels: [i32; 4],
    ) -> Result<ImageHistograms> {
        let [mut h0, mut h1, mut h2, mut h3] = histogram_buffers(levels)?;
        {
            let source = self.view()?;
            <Self as HistogramEvenChannelsImage<T, C4, 4>>::histogram_even_channels(
                self.stream_context,
                &source,
                [&mut h0, &mut h1, &mut h2, &mut h3],
                levels,
                lower_levels,
                upper_levels,
            )?;
        }
        Ok(image_histograms(vec![h0, h1, h2, h3]))
    }
}

impl<'a, T> ImagePipeline<'a, T, C4>
where
    T: Copy,
{
    pub fn histogram_range_channels_into<Level>(
        stream_context: &StreamContext,
        source: &ImageView<'_, T, C4>,
        histograms: [&mut DeviceMemory<i32>; 4],
        levels: [&[Level]; 4],
    ) -> Result<()>
    where
        Level: Copy,
        Self: HistogramRangeChannelsImage<T, C4, Level, 4>,
    {
        <Self as HistogramRangeChannelsImage<T, C4, Level, 4>>::histogram_range_channels(
            stream_context,
            source,
            histograms,
            levels,
        )
    }

    pub fn histogram_range_channels<Level>(self, levels: [&[Level]; 4]) -> Result<ImageHistograms>
    where
        Level: Copy,
        Self: HistogramRangeChannelsImage<T, C4, Level, 4>,
    {
        let [mut h0, mut h1, mut h2, mut h3] = histogram_range_buffers(levels)?;
        {
            let source = self.view()?;
            <Self as HistogramRangeChannelsImage<T, C4, Level, 4>>::histogram_range_channels(
                self.stream_context,
                &source,
                [&mut h0, &mut h1, &mut h2, &mut h3],
                levels,
            )?;
        }
        Ok(image_histograms(vec![h0, h1, h2, h3]))
    }
}