Skip to content

Commit 0438367

Browse files
committed
Add Buffer::byte_stride
1 parent 6b0e832 commit 0438367

File tree

14 files changed

+120
-52
lines changed

14 files changed

+120
-52
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
- Added `Buffer::pixels()` for accessing the buffer's pixel data.
55
- Added `Buffer::pixel_rows()` for iterating over rows of the buffer data.
66
- Added `Buffer::pixels_iter()` for iterating over each pixel with its associated `x`/`y` coordinate.
7+
- Added `Buffer::byte_stride()` for pixel buffers whose rows are aligned and may contain padding bytes at the end. Prefer to use the above helpers instead of accessing pixel data directly.
78
- **Breaking:** Add `Pixel` struct, and use that for pixels instead of `u32`.
89
- **Breaking:** The pixel format is now target-dependent. Access `PixelFormat::default()` to see which format is used on the current platform.
910
- **Breaking:** Removed generic type parameters `D` and `W` from `Buffer<'_>` struct.

examples/animation.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ fn main() {
2323
let window = util::make_window(event_loop, |w| w);
2424

2525
let old_size = (0, 0);
26-
let frames = pre_render_frames(0, 0);
26+
let frames = pre_render_frames(0, 0, 0);
2727

2828
(window, old_size, frames)
2929
},
@@ -64,7 +64,7 @@ fn main() {
6464
let size = (buffer.width().get(), buffer.height().get());
6565
if size != *old_size {
6666
*old_size = size;
67-
*frames = pre_render_frames(size.0, size.1);
67+
*frames = pre_render_frames(buffer.byte_stride().get() / 4, size.0, size.1);
6868
}
6969

7070
let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)];
@@ -94,11 +94,11 @@ fn main() {
9494
util::run_app(event_loop, app);
9595
}
9696

97-
fn pre_render_frames(width: u32, height: u32) -> Vec<Vec<Pixel>> {
97+
fn pre_render_frames(stride: u32, width: u32, height: u32) -> Vec<Vec<Pixel>> {
9898
let render = |frame_id| {
9999
let elapsed = ((frame_id as f64) / (60.0)) * 2.0 * PI;
100100

101-
let coords = (0..height).flat_map(|x| (0..width).map(move |y| (x, y)));
101+
let coords = (0..height).flat_map(|x| (0..stride).map(move |y| (x, y)));
102102
coords
103103
.map(|(x, y)| {
104104
let y = (y as f64) / (height as f64);

examples/fruit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ fn main() {
5252
};
5353

5454
let mut buffer = surface.buffer_mut().unwrap();
55-
let width = fruit.width();
55+
let stride = buffer.byte_stride().get() / 4;
5656
for (x, y, pixel) in fruit.pixels() {
5757
let pixel = Pixel::new_rgb(pixel.0[0], pixel.0[1], pixel.0[2]);
58-
buffer.pixels()[(y * width + x) as usize] = pixel;
58+
buffer.pixels()[(y * stride + x) as usize] = pixel;
5959
}
6060

6161
buffer.present().unwrap();

src/backend_dispatch.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,16 @@ macro_rules! make_dispatch {
146146
}
147147

148148
impl BufferInterface for BufferDispatch<'_> {
149+
#[inline]
150+
fn byte_stride(&self) -> NonZeroU32 {
151+
match self {
152+
$(
153+
$(#[$attr])*
154+
Self::$name(inner) => inner.byte_stride(),
155+
)*
156+
}
157+
}
158+
149159
#[inline]
150160
fn width(&self) -> NonZeroU32 {
151161
match self {

src/backend_interface.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ pub(crate) trait SurfaceInterface<D: HasDisplayHandle + ?Sized, W: HasWindowHand
3535
}
3636

3737
pub(crate) trait BufferInterface {
38+
fn byte_stride(&self) -> NonZeroU32;
3839
fn width(&self) -> NonZeroU32;
3940
fn height(&self) -> NonZeroU32;
4041
fn pixels_mut(&mut self) -> &mut [Pixel];

src/backends/android.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,10 @@ pub struct BufferImpl<'a> {
124124
unsafe impl Send for BufferImpl<'_> {}
125125

126126
impl BufferInterface for BufferImpl<'_> {
127+
fn byte_stride(&self) -> NonZeroU32 {
128+
NonZeroU32::new(self.width().get() * 4).unwrap()
129+
}
130+
127131
fn width(&self) -> NonZeroU32 {
128132
NonZeroU32::new(self.native_window_buffer.width() as u32).unwrap()
129133
}

src/backends/cg.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,10 @@ pub struct BufferImpl<'a> {
279279
}
280280

281281
impl BufferInterface for BufferImpl<'_> {
282+
fn byte_stride(&self) -> NonZeroU32 {
283+
NonZeroU32::new(self.width().get() * 4).unwrap()
284+
}
285+
282286
fn width(&self) -> NonZeroU32 {
283287
NonZeroU32::new(self.width as u32).unwrap()
284288
}

src/backends/kms.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,10 @@ impl<D: ?Sized, W: ?Sized> Drop for KmsImpl<D, W> {
308308
}
309309

310310
impl BufferInterface for BufferImpl<'_> {
311+
fn byte_stride(&self) -> NonZeroU32 {
312+
NonZeroU32::new(self.width().get() * 4).unwrap()
313+
}
314+
311315
fn width(&self) -> NonZeroU32 {
312316
self.size.0
313317
}

src/backends/orbital.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,10 @@ pub struct BufferImpl<'a> {
153153
}
154154

155155
impl BufferInterface for BufferImpl<'_> {
156+
fn byte_stride(&self) -> NonZeroU32 {
157+
NonZeroU32::new(self.width().get() * 4).unwrap()
158+
}
159+
156160
fn width(&self) -> NonZeroU32 {
157161
NonZeroU32::new(self.width as u32).unwrap()
158162
}

src/backends/wayland/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ pub struct BufferImpl<'a> {
219219
}
220220

221221
impl BufferInterface for BufferImpl<'_> {
222+
fn byte_stride(&self) -> NonZeroU32 {
223+
NonZeroU32::new(self.width as u32 * 4).unwrap()
224+
}
225+
222226
fn width(&self) -> NonZeroU32 {
223227
NonZeroU32::new(self.width as u32).unwrap()
224228
}

0 commit comments

Comments
 (0)