Skip to content

Commit a9bae73

Browse files
authored
Add Buffer::width and Buffer::height (#269)
These return `NonZeroU32`.
1 parent 1fa0c20 commit a9bae73

20 files changed

+177
-78
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
- Update to `objc2` 0.6.0.
44
- Bump MSRV to Rust 1.71.
55
- Make `Context` cloneable.
6+
- Added `Buffer::width()` and `Buffer::height()` getters.
67

78
# 0.4.6
89

README.md

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -101,21 +101,18 @@ fn main() {
101101
eprintln!("RedrawRequested fired before Resumed or after Suspended");
102102
return;
103103
};
104-
let (width, height) = {
105-
let size = window.inner_size();
106-
(size.width, size.height)
107-
};
104+
let size = window.inner_size();
108105
surface
109106
.resize(
110-
NonZeroU32::new(width).unwrap(),
111-
NonZeroU32::new(height).unwrap(),
107+
NonZeroU32::new(size.width).unwrap(),
108+
NonZeroU32::new(size.height).unwrap(),
112109
)
113110
.unwrap();
114111
115112
let mut buffer = surface.buffer_mut().unwrap();
116-
for index in 0..(width * height) {
117-
let y = index / width;
118-
let x = index % width;
113+
for index in 0..(buffer.width().get() * buffer.height().get()) {
114+
let y = index / buffer.width().get();
115+
let x = index % buffer.width().get();
119116
let red = x % 255;
120117
let green = y % 255;
121118
let blue = (x * y) % 255;

examples/animation.rs

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -57,23 +57,20 @@ fn main() {
5757
return;
5858
};
5959

60-
let size = window.inner_size();
61-
if let (Some(width), Some(height)) =
62-
(NonZeroU32::new(size.width), NonZeroU32::new(size.height))
63-
{
64-
let elapsed = start.elapsed().as_secs_f64() % 1.0;
60+
let elapsed = start.elapsed().as_secs_f64() % 1.0;
6561

66-
if (width.get(), height.get()) != *old_size {
67-
*old_size = (width.get(), height.get());
68-
*frames = pre_render_frames(width.get() as usize, height.get() as usize);
69-
};
62+
let mut buffer = surface.buffer_mut().unwrap();
7063

71-
let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)];
72-
73-
let mut buffer = surface.buffer_mut().unwrap();
74-
buffer.copy_from_slice(frame);
75-
buffer.present().unwrap();
64+
let size = (buffer.width().get(), buffer.height().get());
65+
if size != *old_size {
66+
*old_size = size;
67+
*frames = pre_render_frames(size.0, size.1);
7668
}
69+
70+
let frame = &frames[((elapsed * 60.0).round() as usize).clamp(0, 59)];
71+
72+
buffer.copy_from_slice(frame);
73+
buffer.present().unwrap();
7774
}
7875
WindowEvent::CloseRequested
7976
| WindowEvent::KeyboardInput {
@@ -97,7 +94,7 @@ fn main() {
9794
winit_app::run_app(event_loop, app);
9895
}
9996

100-
fn pre_render_frames(width: usize, height: usize) -> Vec<Vec<u32>> {
97+
fn pre_render_frames(width: u32, height: u32) -> Vec<Vec<u32>> {
10198
let render = |frame_id| {
10299
let elapsed = ((frame_id as f64) / (60.0)) * 2.0 * PI;
103100

examples/fruit.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,14 +50,14 @@ fn main() {
5050
};
5151

5252
let mut buffer = surface.buffer_mut().unwrap();
53-
let width = fruit.width() as usize;
53+
let width = fruit.width();
5454
for (x, y, pixel) in fruit.pixels() {
5555
let red = pixel.0[0] as u32;
5656
let green = pixel.0[1] as u32;
5757
let blue = pixel.0[2] as u32;
5858

5959
let color = blue | (green << 8) | (red << 16);
60-
buffer[y as usize * width + x as usize] = color;
60+
buffer[(y * width + x) as usize] = color;
6161
}
6262

6363
buffer.present().unwrap();

examples/rectangle.rs

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use raw_window_handle::{HasDisplayHandle, HasWindowHandle};
2+
use softbuffer::Buffer;
13
use std::num::NonZeroU32;
24
use winit::event::{ElementState, KeyEvent, WindowEvent};
35
use winit::event_loop::{ControlFlow, EventLoop};
@@ -6,7 +8,9 @@ use winit::keyboard::{Key, NamedKey};
68
#[path = "utils/winit_app.rs"]
79
mod winit_app;
810

9-
fn redraw(buffer: &mut [u32], width: usize, height: usize, flag: bool) {
11+
fn redraw(buffer: &mut Buffer<'_, impl HasDisplayHandle, impl HasWindowHandle>, flag: bool) {
12+
let width = buffer.width().get();
13+
let height = buffer.height().get();
1014
for y in 0..height {
1115
for x in 0..width {
1216
let value = if flag && x >= 100 && x < width - 100 && y >= 100 && y < height - 100 {
@@ -15,9 +19,9 @@ fn redraw(buffer: &mut [u32], width: usize, height: usize, flag: bool) {
1519
let red = (x & 0xff) ^ (y & 0xff);
1620
let green = (x & 0x7f) ^ (y & 0x7f);
1721
let blue = (x & 0x3f) ^ (y & 0x3f);
18-
(blue | (green << 8) | (red << 16)) as u32
22+
blue | (green << 8) | (red << 16)
1923
};
20-
buffer[y * width + x] = value;
24+
buffer[(y * width + x) as usize] = value;
2125
}
2226
}
2327
}
@@ -66,21 +70,10 @@ fn main() {
6670
eprintln!("RedrawRequested fired before Resumed or after Suspended");
6771
return;
6872
};
69-
// Grab the window's client area dimensions, and ensure they're valid
70-
let size = window.inner_size();
71-
if let (Some(width), Some(height)) =
72-
(NonZeroU32::new(size.width), NonZeroU32::new(size.height))
73-
{
74-
// Draw something in the window
75-
let mut buffer = surface.buffer_mut().unwrap();
76-
redraw(
77-
&mut buffer,
78-
width.get() as usize,
79-
height.get() as usize,
80-
*flag,
81-
);
82-
buffer.present().unwrap();
83-
}
73+
// Draw something in the window
74+
let mut buffer = surface.buffer_mut().unwrap();
75+
redraw(&mut buffer, *flag);
76+
buffer.present().unwrap();
8477
}
8578

8679
WindowEvent::CloseRequested

examples/winit.rs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -43,23 +43,19 @@ pub(crate) fn entry(event_loop: EventLoop<()>) {
4343
eprintln!("RedrawRequested fired before Resumed or after Suspended");
4444
return;
4545
};
46-
let size = window.inner_size();
47-
if let (Some(width), Some(height)) =
48-
(NonZeroU32::new(size.width), NonZeroU32::new(size.height))
49-
{
50-
let mut buffer = surface.buffer_mut().unwrap();
51-
for y in 0..height.get() {
52-
for x in 0..width.get() {
53-
let red = x % 255;
54-
let green = y % 255;
55-
let blue = (x * y) % 255;
56-
let index = y as usize * width.get() as usize + x as usize;
57-
buffer[index] = blue | (green << 8) | (red << 16);
58-
}
59-
}
6046

61-
buffer.present().unwrap();
47+
let mut buffer = surface.buffer_mut().unwrap();
48+
for y in 0..buffer.height().get() {
49+
for x in 0..buffer.width().get() {
50+
let red = x % 255;
51+
let green = y % 255;
52+
let blue = (x * y) % 255;
53+
let index = y * buffer.width().get() + x;
54+
buffer[index as usize] = blue | (green << 8) | (red << 16);
55+
}
6256
}
57+
58+
buffer.present().unwrap();
6359
}
6460
WindowEvent::CloseRequested
6561
| WindowEvent::KeyboardInput {

examples/winit_multithread.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,13 @@ pub mod ex {
4040
surface.resize(width, height).unwrap();
4141

4242
let mut buffer = surface.buffer_mut().unwrap();
43-
for y in 0..height.get() {
44-
for x in 0..width.get() {
43+
for y in 0..buffer.height().get() {
44+
for x in 0..buffer.width().get() {
4545
let red = x % 255;
4646
let green = y % 255;
4747
let blue = (x * y) % 255;
48-
let index = y as usize * width.get() as usize + x as usize;
49-
buffer[index] = blue | (green << 8) | (red << 16);
48+
let index = y * buffer.width().get() + x;
49+
buffer[index as usize] = blue | (green << 8) | (red << 16);
5050
}
5151
}
5252

examples/winit_wrong_sized_buffer.rs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,6 @@ use winit::keyboard::{Key, NamedKey};
66
#[path = "utils/winit_app.rs"]
77
mod winit_app;
88

9-
const BUFFER_WIDTH: usize = 256;
10-
const BUFFER_HEIGHT: usize = 128;
11-
129
fn main() {
1310
let event_loop = EventLoop::new().unwrap();
1411
let context = softbuffer::Context::new(event_loop.owned_display_handle()).unwrap();
@@ -19,10 +16,7 @@ fn main() {
1916
let mut surface = softbuffer::Surface::new(&context, window.clone()).unwrap();
2017
// Intentionally set the size of the surface to something different than the size of the window.
2118
surface
22-
.resize(
23-
NonZeroU32::new(BUFFER_WIDTH as u32).unwrap(),
24-
NonZeroU32::new(BUFFER_HEIGHT as u32).unwrap(),
25-
)
19+
.resize(NonZeroU32::new(256).unwrap(), NonZeroU32::new(128).unwrap())
2620
.unwrap();
2721
surface
2822
},
@@ -42,14 +36,15 @@ fn main() {
4236
};
4337

4438
let mut buffer = surface.buffer_mut().unwrap();
45-
for y in 0..BUFFER_HEIGHT {
46-
for x in 0..BUFFER_WIDTH {
47-
let red = x as u32 % 255;
48-
let green = y as u32 % 255;
49-
let blue = (x as u32 * y as u32) % 255;
39+
let width = buffer.width().get();
40+
for y in 0..buffer.height().get() {
41+
for x in 0..width {
42+
let red = x % 255;
43+
let green = y % 255;
44+
let blue = (x * y) % 255;
5045

5146
let color = blue | (green << 8) | (red << 16);
52-
buffer[y * BUFFER_WIDTH + x] = color;
47+
buffer[(y * width + x) as usize] = color;
5348
}
5449
}
5550
buffer.present().unwrap();

src/backend_dispatch.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,26 @@ macro_rules! make_dispatch {
125125
}
126126

127127
impl<'a, D: HasDisplayHandle, W: HasWindowHandle> BufferInterface for BufferDispatch<'a, D, W> {
128+
#[inline]
129+
fn width(&self) -> NonZeroU32 {
130+
match self {
131+
$(
132+
$(#[$attr])*
133+
Self::$name(inner) => inner.width(),
134+
)*
135+
}
136+
}
137+
138+
#[inline]
139+
fn height(&self) -> NonZeroU32 {
140+
match self {
141+
$(
142+
$(#[$attr])*
143+
Self::$name(inner) => inner.height(),
144+
)*
145+
}
146+
}
147+
128148
#[inline]
129149
fn pixels(&self) -> &[u32] {
130150
match self {

src/backend_interface.rs

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

3737
pub(crate) trait BufferInterface {
38+
fn width(&self) -> NonZeroU32;
39+
fn height(&self) -> NonZeroU32;
3840
fn pixels(&self) -> &[u32];
3941
fn pixels_mut(&mut self) -> &mut [u32];
4042
fn age(&self) -> u8;

0 commit comments

Comments
 (0)