Buf2

Struct Buf2 

Source
pub struct Buf2<T>(/* private fields */);
Expand description

A rectangular 2D buffer that owns its elements, backed by a Vec.

Unlike Vec, however, Buf2 cannot be resized after construction without explicitly copying the contents to a new, larger buffer.

Buf2 stores its elements contiguously, in standard row-major order, such that the coordinate pair (x, y) maps to index buf.width() * y + x in the backing vector.

§Examples

// Elements initialized with `Default::default()`
let mut buf = Buf2::new((4, 4));
// Indexing with a 2D point (x, y) yields element at row y, column x:
buf[pt2(2, 1)] = 123;
// Indexing with an usize i yields row with index i as a slice:
assert_eq!(buf[1], [0, 0, 123, 0]);
// Thus you can also do this, row first, column second:
assert_eq!(buf[1][2], 123)

Implementations§

Source§

impl<T> Buf2<T>

Source

pub fn new_from<I>((w, h): Dims, init: I) -> Self
where I: IntoIterator<Item = T>,

Returns a buffer of size w × h, with elements initialized with values yielded by init.

The elements are initialized in row-major order. Does not allocate or consume items from init if w = 0 or h = 0.

§Examples
use retrofire_core::util::buf::Buf2;

let buf = Buf2::new_from((3, 3), 1..);

assert_eq!(buf.dims(), (3, 3));
assert_eq!(buf.data(), [1, 2, 3,
                        4, 5, 6,
                        7, 8, 9]);
§Panics
  • If w * h > isize::MAX, or
  • if init has fewer than w * h elements.
Source

pub fn new((w, h): Dims) -> Self
where T: Default + Clone,

Returns a buffer of size w × h, with every element initialized to T::default().

Does not allocate if w = 0 or h = 0.

§Examples
use retrofire_core::util::buf::Buf2;

let buf: Buf2<i32> = Buf2::new((3, 3));

assert_eq!(buf.dims(), (3, 3));
assert_eq!(buf.data(), [0, 0, 0,
                        0, 0, 0,
                        0, 0, 0]);
§Panics

If w * h > isize::MAX.

Examples found in repository?
examples/hello_tri.rs (line 35)
4fn main() {
5    let verts = [
6        vertex(pt3(-1.0, 1.0, 0.0), rgb(1.0, 0.0, 0.0)),
7        vertex(pt3(1.0, 1.0, 0.0), rgb(0.0, 0.8, 0.0)),
8        vertex(pt3(0.0, -1.0, 0.0), rgb(0.4, 0.4, 1.0)),
9    ];
10
11    #[cfg(feature = "fp")]
12    let shader = shader::new(
13        |v: Vertex3<Color3f>, mvp: &Mat4x4<ModelToProj>| {
14            // Transform vertex position from model to projection space
15            // Interpolate vertex colors in linear color space
16            vertex(mvp.apply(&v.pos), v.attrib.to_linear())
17        },
18        |frag: Frag<Color3f<_>>| frag.var.to_srgb().to_color4(),
19    );
20    #[cfg(not(feature = "fp"))]
21    let shader = shader::new(
22        |v: Vertex3<Color3f>, mvp: &Mat4x4<ModelToProj>| {
23            // Transform vertex position from model to projection space
24            // Interpolate vertex colors in normal sRGB color space
25            vertex(mvp.apply(&v.pos), v.attrib)
26        },
27        |frag: Frag<Color3f<_>>| frag.var.to_color4(),
28    );
29
30    let dims @ (w, h) = (640, 480);
31    let modelview = translate3(0.0, 0.0, 2.0).to();
32    let project = perspective(1.0, w as f32 / h as f32, 0.1..1000.0);
33    let viewport = viewport(pt2(0, h)..pt2(w, 0));
34
35    let mut framebuf = Buf2::<Color4>::new(dims);
36
37    render(
38        [tri(0, 1, 2)],
39        verts,
40        &shader,
41        &modelview.then(&project),
42        viewport,
43        &mut framebuf,
44        &Context::default(),
45    );
46
47    let center_pixel = framebuf[[w / 2, h / 2]];
48
49    if cfg!(feature = "fp") {
50        assert_eq!(center_pixel, rgba(150, 128, 186, 255));
51    } else {
52        assert_eq!(center_pixel, rgba(114, 102, 127, 255));
53    }
54    #[cfg(feature = "std")]
55    {
56        pnm::save_ppm("triangle.ppm", framebuf).unwrap();
57    }
58}
Source

pub fn new_with<F>((w, h): Dims, init_fn: F) -> Self
where F: FnMut(u32, u32) -> T,

Returns a buffer of size w × h, initialized by repeatedly calling the given function.

For each element, init_fn(x, y) is invoked, where x is the column index and y the row index of the element being initialized. The elements are initialized in row-major order.

Does not allocate or call init_fn if w = 0 or h = 0.

§Examples
use retrofire_core::util::buf::Buf2;

let buf = Buf2::new_with((3, 3), |x, y| 10 * y + x);
assert_eq!(buf.data(), [ 0,  1, 2,
                        10, 11, 12,
                        20, 21, 22]);
§Panics

If w * h > isize::MAX.

Source

pub fn data(&self) -> &[T]

Returns a view of the backing data of self.

Source

pub fn data_mut(&mut self) -> &mut [T]

Returns a mutable view of the backing data of self.

Source

pub fn reshape(&mut self, dims: Dims)

Reinterprets self as a buffer of different dimensions but same area.

§Panics

If nw * nh != cw * ch for the new dimensions (nw, nh) and current dimensions (cw, ch).

Methods from Deref<Target = Inner<T, Vec<T>>>§

Source

pub fn width(&self) -> u32

Returns the width of self.

Source

pub fn height(&self) -> u32

Returns the height of self.

Source

pub fn dims(&self) -> Dims

Returns the width and height of self.

Source

pub fn stride(&self) -> u32

Returns the stride of self.

Source

pub fn is_contiguous(&self) -> bool

Returns whether the rows of self are stored as one contiguous slice, without gaps between rows.

Buf2 instances are always contiguous. A Slice2 or MutSlice2 instance is contiguous if its width equals its stride, if its height is 1, or if it is empty.

Source

pub fn is_empty(&self) -> bool

Returns whether self contains no elements.

Source

pub fn as_slice2(&self) -> Slice2<'_, T>

Borrows self as a Slice2.

Source

pub fn slice(&self, rect: impl Into<Rect>) -> Slice2<'_, T>

Returns a borrowed rectangular slice of self.

§Panics

If any part of rect is outside the bounds of self.

Source

pub fn get(&self, pos: impl Into<Point2u>) -> Option<&T>

Returns a reference to the element at pos, or None if pos is out of bounds.

Source

pub fn rows(&self) -> impl Iterator<Item = &[T]>

Returns an iterator over the rows of self as &[T] slices.

The length of each slice equals self.width().

Source

pub fn iter(&self) -> impl Iterator<Item = &T>

Returns an iterator over the elements of self in row-major order.

First returns the elements on row 0 from left to right, followed by the elements on row 1, and so on.

Source

pub fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>

Returns a mutably borrowed rectangular slice of self.

Source

pub fn rows_mut(&mut self) -> impl Iterator<Item = &mut [T]>

Returns an iterator over the rows of this buffer as &mut [T].

The length of each slice equals self.width().

Source

pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T>

Returns a mutable iterator over all the elements of self, yielded in row-major order.

Source

pub fn fill(&mut self, val: T)
where T: Clone,

Fills self with clones of the value.

Source

pub fn fill_with<F>(&mut self, fill_fn: F)
where F: FnMut(u32, u32) -> T,

Fills self by calling a function for each element.

Calls f(x, y) for every element, where x and y are the column and row indices of the element. Proceeds in row-major order.

Source

pub fn copy_from(&mut self, other: impl AsSlice2<T>)
where T: Copy,

Copies each element in other to the same position in self.

This operation is often called “blitting”.

§Panics

if the dimensions of self and other do not match.

Source

pub fn get_mut(&mut self, pos: impl Into<Point2u>) -> Option<&mut T>

Returns a mutable reference to the element at pos, or None if pos is out of bounds.

Source

pub fn slice_mut(&mut self, rect: impl Into<Rect>) -> MutSlice2<'_, T>

Returns a mutably borrowed rectangular slice of self.

§Panics

If any part of rect is outside the bounds of self.

Trait Implementations§

Source§

impl<T> AsMutSlice2<T> for &mut Buf2<T>

Source§

fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>

Returns a mutably borrowed MutSlice2 view of Self.
Source§

impl<T> AsMutSlice2<T> for Buf2<T>

Source§

fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>

Returns a mutably borrowed MutSlice2 view of Self.
Source§

impl<T> AsSlice2<T> for &Buf2<T>

Source§

fn as_slice2(&self) -> Slice2<'_, T>

Returns a borrowed Slice2 view of Self.
Source§

impl<T> AsSlice2<T> for Buf2<T>

Source§

fn as_slice2(&self) -> Slice2<'_, T>

Returns a borrowed Slice2 view of Self.
Source§

impl<T: Clone> Clone for Buf2<T>

Source§

fn clone(&self) -> Buf2<T>

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<T> Debug for Buf2<T>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl<T> Deref for Buf2<T>

Source§

type Target = Inner<T, Vec<T>>

The resulting type after dereferencing.
Source§

fn deref(&self) -> &Self::Target

Dereferences the value.
Source§

impl<T> DerefMut for Buf2<T>

Source§

fn deref_mut(&mut self) -> &mut Self::Target

Mutably dereferences the value.
Source§

impl<C> From<Buf2<C>> for Texture<Buf2<C>>

Source§

fn from(data: Buf2<C>) -> Self

Creates a new texture from owned pixel data.

Source§

impl<T: PartialEq> PartialEq for Buf2<T>

Source§

fn eq(&self, other: &Buf2<T>) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Target for Buf2<Color3>

Source§

fn rasterize<V: Vary, Fs: FragmentShader<V>>( &mut self, sl: Scanline<V>, fs: &Fs, ctx: &Context, ) -> Throughput

Writes a single scanline into self. Read more
Source§

impl Target for Buf2<Color4>

Source§

fn rasterize<V: Vary, Fs: FragmentShader<V>>( &mut self, sl: Scanline<V>, fs: &Fs, ctx: &Context, ) -> Throughput

Writes a single scanline into self. Read more
Source§

impl<T: Eq> Eq for Buf2<T>

Source§

impl<T> StructuralPartialEq for Buf2<T>

Auto Trait Implementations§

§

impl<T> Freeze for Buf2<T>

§

impl<T> RefUnwindSafe for Buf2<T>
where T: RefUnwindSafe,

§

impl<T> Send for Buf2<T>
where T: Send,

§

impl<T> Sync for Buf2<T>
where T: Sync,

§

impl<T> Unpin for Buf2<T>
where T: Unpin,

§

impl<T> UnwindSafe for Buf2<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<P, T> Receiver for P
where P: Deref<Target = T> + ?Sized, T: ?Sized,

Source§

type Target = T

🔬This is a nightly-only experimental API. (arbitrary_self_types)
The target type on which the method may be called.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.