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>
impl<T> Buf2<T>
Sourcepub fn new_from<I>((w, h): Dims, init: I) -> Selfwhere
I: IntoIterator<Item = T>,
pub fn new_from<I>((w, h): Dims, init: I) -> Selfwhere
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
inithas fewer thanw * helements.
Sourcepub fn new((w, h): Dims) -> Self
pub fn new((w, h): Dims) -> Self
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?
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}Sourcepub fn new_with<F>((w, h): Dims, init_fn: F) -> Self
pub fn new_with<F>((w, h): Dims, init_fn: F) -> Self
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.
Methods from Deref<Target = Inner<T, Vec<T>>>§
Sourcepub fn is_contiguous(&self) -> bool
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.
Sourcepub fn slice(&self, rect: impl Into<Rect>) -> Slice2<'_, T>
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.
Sourcepub fn get(&self, pos: impl Into<Point2u>) -> Option<&T>
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.
Sourcepub fn rows(&self) -> impl Iterator<Item = &[T]>
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().
Sourcepub fn iter(&self) -> impl Iterator<Item = &T>
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.
Sourcepub fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
pub fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
Returns a mutably borrowed rectangular slice of self.
Sourcepub fn rows_mut(&mut self) -> impl Iterator<Item = &mut [T]>
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().
Sourcepub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T>
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.
Sourcepub fn fill_with<F>(&mut self, fill_fn: F)
pub fn fill_with<F>(&mut self, fill_fn: F)
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.
Sourcepub fn copy_from(&mut self, other: impl AsSlice2<T>)where
T: Copy,
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.
Trait Implementations§
Source§impl<T> AsMutSlice2<T> for &mut Buf2<T>
impl<T> AsMutSlice2<T> for &mut Buf2<T>
Source§fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
MutSlice2 view of Self.Source§impl<T> AsMutSlice2<T> for Buf2<T>
impl<T> AsMutSlice2<T> for Buf2<T>
Source§fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
fn as_mut_slice2(&mut self) -> MutSlice2<'_, T>
MutSlice2 view of Self.Source§impl Target for Buf2<Color3>
impl Target for Buf2<Color3>
Source§fn rasterize<V: Vary, Fs: FragmentShader<V>>(
&mut self,
sl: Scanline<V>,
fs: &Fs,
ctx: &Context,
) -> Throughput
fn rasterize<V: Vary, Fs: FragmentShader<V>>( &mut self, sl: Scanline<V>, fs: &Fs, ctx: &Context, ) -> Throughput
self. Read moreSource§impl Target for Buf2<Color4>
impl Target for Buf2<Color4>
Source§fn rasterize<V: Vary, Fs: FragmentShader<V>>(
&mut self,
sl: Scanline<V>,
fs: &Fs,
ctx: &Context,
) -> Throughput
fn rasterize<V: Vary, Fs: FragmentShader<V>>( &mut self, sl: Scanline<V>, fs: &Fs, ctx: &Context, ) -> Throughput
self. Read more