Skip to content

Commit badc098

Browse files
committed
Add Buffer::byte_stride
1 parent 688a216 commit badc098

File tree

14 files changed

+100
-37
lines changed

14 files changed

+100
-37
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Added `Buffer::pixels()` for accessing the buffer's pixel data.
44
- Added `Buffer::pixel_rows()` for iterating over rows of the buffer data.
55
- Added `Buffer::pixels_iter()` for iterating over each pixel with its associated `x`/`y` coordinate.
6+
- 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.
67
- **Breaking:** Removed generic type parameters `D` and `W` from `Buffer<'_>` struct.
78
- **Breaking:** Removed `Deref[Mut]` implementation on `Buffer<'_>`. Use `Buffer::pixels()` instead.
89

examples/animation.rs

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

2424
let old_size = (0, 0);
25-
let frames = pre_render_frames(0, 0);
25+
let frames = pre_render_frames(0, 0, 0);
2626

2727
(window, old_size, frames)
2828
},
@@ -65,7 +65,7 @@ fn main() {
6565
let size = (buffer.width().get(), buffer.height().get());
6666
if size != *old_size {
6767
*old_size = size;
68-
*frames = pre_render_frames(size.0, size.1);
68+
*frames = pre_render_frames(buffer.byte_stride().get() / 4, size.0, size.1);
6969
}
7070

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

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

102-
let coords = (0..height).flat_map(|x| (0..width).map(move |y| (x, y)));
102+
let coords = (0..height).flat_map(|x| (0..stride).map(move |y| (x, y)));
103103
coords
104104
.map(|(x, y)| {
105105
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
@@ -51,14 +51,14 @@ fn main() {
5151
};
5252

5353
let mut buffer = surface.buffer_mut().unwrap();
54-
let width = fruit.width();
54+
let stride = buffer.byte_stride().get() / 4;
5555
for (x, y, pixel) in fruit.pixels() {
5656
let red = pixel.0[0] as u32;
5757
let green = pixel.0[1] as u32;
5858
let blue = pixel.0[2] as u32;
5959

6060
let color = blue | (green << 8) | (red << 16);
61-
buffer.pixels()[(y * width + x) as usize] = color;
61+
buffer.pixels()[(y * stride + x) as usize] = color;
6262
}
6363

6464
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 [u32];

src/backends/android.rs

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

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

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
@@ -305,6 +305,10 @@ impl<D: ?Sized, W: ?Sized> Drop for KmsImpl<D, W> {
305305
}
306306

307307
impl BufferInterface for BufferImpl<'_> {
308+
fn byte_stride(&self) -> NonZeroU32 {
309+
NonZeroU32::new(self.width().get() * 4).unwrap()
310+
}
311+
308312
fn width(&self) -> NonZeroU32 {
309313
self.size.0
310314
}

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)