singe-npp 0.1.0-alpha.8

Safe Rust wrappers for NVIDIA Performance Primitives library (NPP).
Documentation
use super::*;

#[test]
fn fluent_image_pipeline_runs_integral_statistics() -> Result<()> {
    let (stream, stream_context) = create_stream_context()?;
    let source_host = [1u8, 2, 3, 4];
    let source_memory = DeviceMemory::from_slice(&source_host)?;
    let source = ImageView::<_, C1>::from_memory(&source_memory, Size::new(2, 2))?;
    let mut i32_workspace = Workspace::create();

    let i32_image = ImagePipeline::from_view(&stream_context, &mut i32_workspace, source)
        .integral_to_i32(0)?
        .finish()?;

    let mut f32_workspace = Workspace::create();
    let f32_image = ImagePipeline::from_view(&stream_context, &mut f32_workspace, source)
        .integral_to_f32(0.0)?
        .finish()?;
    let mut squared_i32_workspace = Workspace::create();
    let squared_i32 = ImagePipeline::from_view(&stream_context, &mut squared_i32_workspace, source)
        .squared_integral_to_i32_i32(0, 0)?;
    let mut squared_f64_workspace = Workspace::create();
    let squared_f64 = ImagePipeline::from_view(&stream_context, &mut squared_f64_workspace, source)
        .squared_integral_to_i32_f64(0, 0.0)?;
    let mut squared_f32_workspace = Workspace::create();
    let squared_f32 = ImagePipeline::from_view(&stream_context, &mut squared_f32_workspace, source)
        .squared_integral_to_f32_f64(0.0, 0.0)?;
    let rectangle = Rectangle {
        x: 0,
        y: 0,
        width: 2,
        height: 2,
    };
    let mut rect_i32_workspace = Workspace::create();
    let rect_i32 = ImagePipeline::from_view(
        &stream_context,
        &mut rect_i32_workspace,
        squared_i32.integral.view()?,
    )
    .rect_standard_deviation_scaled(&squared_i32.squared.view()?, rectangle, 0)?
    .finish()?;
    let mut rect_i32_to_f32_workspace = Workspace::create();
    let rect_i32_to_f32 = ImagePipeline::from_view(
        &stream_context,
        &mut rect_i32_to_f32_workspace,
        squared_f64.integral.view()?,
    )
    .rect_standard_deviation_to_f32(&squared_f64.squared.view()?, rectangle)?
    .finish()?;
    let mut rect_f32_workspace = Workspace::create();
    let rect_f32 = ImagePipeline::from_view(
        &stream_context,
        &mut rect_f32_workspace,
        squared_f32.integral.view()?,
    )
    .rect_standard_deviation(&squared_f32.squared.view()?, rectangle)?
    .finish()?;

    stream.synchronize()?;

    assert_eq!(
        i32_image.size(),
        Size {
            width: 3,
            height: 3,
        }
    );
    assert_eq!(
        f32_image.size(),
        Size {
            width: 3,
            height: 3,
        }
    );
    assert!(i32_image.step() >= 12);
    assert!(f32_image.step() >= 12);
    assert_eq!(
        squared_i32.integral.size(),
        Size {
            width: 3,
            height: 3,
        }
    );
    assert_eq!(squared_i32.squared.size(), squared_i32.integral.size());
    assert_eq!(squared_f64.squared.size(), squared_f64.integral.size());
    assert_eq!(squared_f32.squared.size(), squared_f32.integral.size());
    assert_eq!(
        squared_i32.integral.values().copy_to_host_vec()?,
        [0, 0, 0, 0, 1, 3, 0, 4, 10]
    );
    assert_eq!(
        squared_i32.squared.values().copy_to_host_vec()?,
        [0, 0, 0, 0, 1, 5, 0, 10, 30]
    );
    assert_eq!(
        squared_f64.squared.values().copy_to_host_vec()?,
        [0.0, 0.0, 0.0, 0.0, 1.0, 5.0, 0.0, 10.0, 30.0]
    );
    assert_eq!(
        squared_f32.integral.values().copy_to_host_vec()?,
        [0.0, 0.0, 0.0, 0.0, 1.0, 3.0, 0.0, 4.0, 10.0]
    );
    assert_eq!(
        rect_i32.size(),
        Size {
            width: 1,
            height: 1,
        }
    );
    assert_eq!(
        rect_i32_to_f32.size(),
        Size {
            width: 1,
            height: 1,
        }
    );
    assert_eq!(
        rect_f32.size(),
        Size {
            width: 1,
            height: 1,
        }
    );

    Ok(())
}